- Home /
Object reference not set to an instance of an Object
using UnityEngine; using System.Collections;
public class PlayerController : MonoBehaviour {
public GameObject playerObject;
public float walkSpeed = 2;
public float runSpeed = 6;
public float gravity = -12;
public float jumpHeight = 1;
[Range(0,1)]
public float airControlPercent;
public float turnSmoothTime = 0.2f;
float turnSmoothVelocity;
public float speedSmoothTime = 0.1f;
float speedSmoothVelocity;
float currentSpeed;
float velocityY;
Animator animator;
Transform cameraT;
CharacterController controller;
void Start () {
animator = GetComponent<Animator> ();
cameraT = Camera.main.transform;
controller = GetComponent<CharacterController> ();
}
void Update () {
// input
Vector2 input = new Vector2 (Input.GetAxisRaw ("Horizontal"), Input.GetAxisRaw ("Vertical"));
Vector2 inputDir = input.normalized;
bool running = Input.GetKey (KeyCode.LeftShift);
Move (inputDir, running);
if (Input.GetKeyDown (KeyCode.Space)) {
Jump ();
}
// animator
float animationSpeedPercent = ((running) ? currentSpeed / runSpeed : currentSpeed / walkSpeed * .5f);
animator.SetFloat ("speedPercent", animationSpeedPercent, speedSmoothTime, Time.deltaTime);
}
void Move(Vector2 inputDir, bool running) {
if (inputDir != Vector2.zero) {
float targetRotation = Mathf.Atan2 (inputDir.x, inputDir.y) * Mathf.Rad2Deg + cameraT.eulerAngles.y;
transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref turnSmoothVelocity, GetModifiedSmoothTime(turnSmoothTime));
}
float targetSpeed = ((running) ? runSpeed : walkSpeed) * inputDir.magnitude;
currentSpeed = Mathf.SmoothDamp (currentSpeed, targetSpeed, ref speedSmoothVelocity, GetModifiedSmoothTime(speedSmoothTime));
velocityY += Time.deltaTime * gravity;
Vector3 velocity = transform.forward * currentSpeed + Vector3.up * velocityY;
controller.Move (velocity * Time.deltaTime);
currentSpeed = new Vector2 (controller.velocity.x, controller.velocity.z).magnitude;
if (controller.isGrounded) {
velocityY = 0;
}
}
void Jump() {
if (controller.isGrounded) {
float jumpVelocity = Mathf.Sqrt (-2 * gravity * jumpHeight);
velocityY = jumpVelocity;
}
}
float GetModifiedSmoothTime(float smoothTime) {
if (controller.isGrounded) {
return smoothTime;
}
if (airControlPercent == 0) {
return float.MaxValue;
}
return smoothTime / airControlPercent;
}
}
![alt text][1] [1]: /storage/temp/96810-2017-06-29-4.png
Whats the problem ? I can add the this code and it gave the error
Answer by cbjunior · Jun 29, 2017 at 01:12 PM
It seems like your script isn't finding the CharacterController component. Are you sure you have one attached to your object that the script is attached to?
One good error checking practice for scripts is to check to make sure that the component is actually found by the script.
controller = GetComponent<CharacterController>();
if (!controller) //Check for controller reference
{
Debug.LogError("Didn't find CharacterController");
}
controller is not a boolean, so you cannot just do if (!controller)
You will have to use if (controller != null)
@ShadyProductions All the classes derived from Component overload the ! operator, so you can use them like a boolean.
https://docs.unity3d.com/ScriptReference/Component.html Look under operators, you will see bool
Your answer
![](https://koobas.hobune.stream/wayback/20220612125133im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Base Character error 1 Answer
How can I have a CharacterController's height make it to where the feet are correctly on the ground? 0 Answers
How do I solve this error? 2 Answers
fps script not working 1 Answer
[C#]CharacterController Turning 2 Answers