如何统一解决这些错误?

时间:2014-01-28 09:36:36

标签: unity3d nullreferenceexception unityscript

我是团结的新手。我正在通过一些链接获得帮助来创建二维游戏。我的游戏工作正常。但是,当角色被摧毁的游戏从起点开始时就像往常一样,但它会暂停。并显示一些我不知道如何解决这些错误的错误。

PlayerRespawn.js -

var Player : GameObject;
var SpawnPoint: Transform;

function OnTriggerEnter(other: Collider) {
Destroy(other.gameObject);
var P: GameObject= Instantiate(Player,SpawnPoint.position,Quaternion.identity);

var sf = Camera.main.GetComponent(SmoothFollow2);
sf.target=P.transform;
}

SmoothFollow2.js -

var target : Transform;
var distance = 3.0;
var height = 3.0;
var damping = 5.0;
var smoothRotation = true;
var rotationDamping = 10.0;
var lockRotation : boolean;

function Update () {
    var wantedPosition = target.TransformPoint(0, height, -distance);
    transform.position = Vector3.Lerp (transform.position, wantedPosition, Time.deltaTime * damping);

    if (smoothRotation) {
        var wantedRotation = Quaternion.LookRotation(target.position - transform.position, target.up);
        transform.rotation = Quaternion.Slerp (transform.rotation, wantedRotation, Time.deltaTime * rotationDamping);
    }


    else transform.LookAt (target, target.up);

    if (lockRotation){
    transform.localRotation=Quaternion.EulerAngles(0,0,0);
    }
}

我得到的错误是 -

NullReferenceException
PlayerRespawn.OnTriggerEnter (UnityEngine.Collider other) (at Assets/MyScripts/PlayerRespawn.js:8)
MissingReferenceException: The object of type 'Transform' has been destroyed but you are still trying to access it.

3 个答案:

答案 0 :(得分:3)

考虑抛出错误的行是:

var sf = Camera.main.GetComponent(SmoothFollow2);

听起来好像你的相机已被毁坏了。检查此问题的一种方法是在触发器中粘贴Debug消息,以查看究竟是什么被销毁。尝试将Debug.LogWarning(other.gameObject.name);放在OnTriggerEnter(other: Collider)函数的开头。如果您看到相机名称显示为警告,那么您就知道情况就是这样。

您可以通过执行以下操作来阻止此操作:

if(other.gameObject.name == Camera.main.gameObject.name)
    return;

更好的解决方案,如果只需要销毁的物品范围有限,则只允许那些物品继续通过OnTriggerEnter

答案 1 :(得分:0)

我不会摧毁玩家。我只是禁用,然后在另一个定义的位置或初始位置再次启用它。

通过执行此操作,您的相机(通过var“target”跟随您的播放器)将始终具有引用的对象,并将停止为您抛出错误。

禁用游戏对象:

gameObject.SetActive = false;

再次启用它:

gameObject.SetActive = true;

我希望有所帮助。

答案 2 :(得分:-1)

我解决了这个问题,确保在创建播放器预制件之前将主摄像头作为儿童连接到播放器,以便在重新生成时它具有主摄像头

希望这可以帮助您解决问题

"为了增加价值,我知道您正在使用的教程,并帮助理解我的帖子,您需要做的是,在您的层次结构中制作播放器(第一人称控制器)的预制件之前统一编辑器将主摄像头拖放到(第一人称控制器)上然后制作播放器的预制件。 - "