我正在尝试制作FPS控制器脚本,以便可以在Unity中与角色一起行走,跳跃和飞行。 I followed this tutorial right here.
我遇到的问题是,每当我尝试在Unity中运行脚本时,都会出现以下错误:
NullReferenceException: Object reference not set to an instance of an object
PlayerController.Update () (at Assets/PlayerController.cs:65)
我确实了解该错误的含义,但我只是不了解该错误的产生原因和解决方法。我希望你们能在这里帮助我。我一直在寻找一个好的剧本来使我的角色飞起来(也许我看起来还不够好)。
可以在这里查看代码:
播放器控制器脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
Rigidbody rb;
public bool isFlying, isGrounded;
public float w_speed, r_speed, fly_speed, fly_boost, mouse_sensitivity, Jump_Height, Float_Force;
private float g_speed, f_speed, mouseX, mouseY;
// Use this for initialization
void Start () {
rb = GetComponent<Rigidbody>();
isFlying = false;
isGrounded = true;
}
// Update is called once per frame
void Update () {
//Base Settings
var gx = Input.GetAxis("Horizontal") * g_speed;
var fx = Input.GetAxis("Horizontal") * f_speed;
var gz = Input.GetAxis("Vertical") * g_speed;
var fz = Input.GetAxis("Vertical") * f_speed;
mouseX -= Input.GetAxis("Mouse Y") * mouse_sensitivity;
mouseY += Input.GetAxis("Mouse X") * mouse_sensitivity;
if (Input.GetKey(KeyCode.LeftShift))
{
g_speed = r_speed;
f_speed = fly_boost;
}
else
{
g_speed = w_speed;
f_speed = fly_speed;
}
if (isFlying)
{
rb.drag = 1;
mouseX = Mathf.Clamp(mouseX, -90, 90);
transform.Translate(fx, 0, fz);
if (Input.GetKey(KeyCode.Space))
{
rb.AddForce(transform.up * Float_Force, ForceMode.Force);
}
}
else
{
rb.drag = 0;
mouseX = Mathf.Clamp(mouseX, -60, 60);
transform.Translate(gx, 0, gz);
}
transform.rotation = Quaternion.Euler(0, mouseY, 0);
Camera.main.transform.rotation = Quaternion.Euler(mouseX, mouseY, 0);
if(Input.GetKeyUp(KeyCode.Space) && isGrounded)
{
isGrounded = false;
rb.AddForce(transform.up * Jump_Height, ForceMode.Impulse);
}
if(Input.GetKeyDown(KeyCode.Space) && !isGrounded)
{
isFlying = true;
}
}
private void OnCollisionEnter(Collision collision)
{
isGrounded = true;
isFlying = false;
}
}
本教程中显示的世界物理脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WorldPhysics : MonoBehaviour {
public float Gravity_Strength;
// Update is called once per frame
void Update () {
Physics.gravity = new Vector3(0, -Gravity_Strength, 0);
}
}