- Home /
Fly Mode 2D + Rigid Body vs CharacterController problems
Hello Guys !!
This is my very first question regarding unity scripting. I dont think i have understood the difference between a rigid boday and character controller :(
Im trying to make this kind of setup for my game : if the player presses the space bar on ground then he jumps (like duh) but when he presses it midair....instead of infinite jumping i want the player to enter a sort of "Fly Mode" where he can move in vertical and Horizontal ( a 2d plane) with WSAD.
flymode is just a boolean varible i made for the ability to use fly mode......
please help me out Main Error : NullReferenceException: Object reference not set to an instance of an object PlayerMovement.Start () (at Assets/Player/PlayerMovement.cs:27)
NullReferenceException: Object reference not set to an instance of an object
PlayerMovement.Start () (at Assets/Player/PlayerMovement.cs:71)
Also im not sure my algorithm for the fly mode is right
Thanks in advance !!!
using UnityEngine;
using System.Collections;
public class PlayerMovement : MonoBehaviour {
Vector3 currentMovement;
Vector3 targetMovement;
Vector3 refMovement;
public float moveSpeed = 10;
public float flySpeed = 25;
public float airControl = 0.8f;
public float grndControl = 0.05f;
private float moveSmoothener;
//Gravity
public float jumpSpeed = 500;
bool flyMode = true;
bool isFlying = false;
CharacterController charControl;
void Start ()
{
charControl = GetComponent<CharacterController> ();
charControl.attachedRigidbody.useGravity = true;
}
void Update ()
{
if (Input.GetKeyDown (KeyCode.E))
flyMode = !flyMode;
targetMovement = new Vector3 (Input.GetAxisRaw ("Horizontal") * moveSpeed, 0, 0);
if (isFlying)
targetMovement = new Vector3 (Input.GetAxisRaw ("Horizontal") * flySpeed, Input.GetAxisRaw ("Vertical") * flySpeed, 0);
currentMovement = Vector3.SmoothDamp (currentMovement, targetMovement, ref refMovement, moveSmoothener);
if (charControl.isGrounded)
{
moveSmoothener = grndControl;
isFlying = false;
charControl.attachedRigidbody.useGravity = true;
}
if(Input.GetButtonDown("Jump"))
{
if(isFlying)
{
charControl.attachedRigidbody.useGravity = true;
isFlying = false;
}
if (charControl.isGrounded)
{
charControl.attachedRigidbody.AddForce(0,jumpSpeed,0);
moveSmoothener = airControl;
}
else if(charControl.isGrounded && flyMode)
{
isFlying = true;
charControl.attachedRigidbody.useGravity = false;
}
}
charControl.attachedRigidbody.MovePosition(transform.position + Time.deltaTime * currentMovement);
}
}