EasyTouch关于unity3d错误

郑义9027

我正在使用Unity3D创建一个演示。演示是这样的:使用EasyTouch来控制名为“ Player”的游戏对象(飞机)的运动。

创建EasyTouch之后,我将创建一个C#脚本,如下所示:

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {
    public float m_speed = 1;

    protected Transform m_transform;

    public MovePlayer m_movePlayer;
    // Use this for initialization
    void Start () {
        m_transform = this.transform;
    }

    // Update is called once per frame
    void Update () {
    }

    void OnEnable(){
        Debug.Log ("OnEnable");
        EasyJoystick.On_JoystickMoveStart += HandleOn_JoystickMoveStart;
        EasyJoystick.On_JoystickMove += HandleOn_JoystickMove;
        EasyJoystick.On_JoystickMoveEnd += HandleOn_JoystickMoveEnd;
    }

    void HandleOn_JoystickMoveStart (MovingJoystick move)
    {

    }

    void HandleOn_JoystickMoveEnd (MovingJoystick move)
    {
    }

    void HandleOn_JoystickMove (MovingJoystick move)
    {
        Debug.Log ("HandleOn_JoystickMove");

        if (m_transform == null) {
                m_transform = this.transform;
        }

        if (move.joystickName != "moveJoystick") {
            Debug.Log ("return");
            return;
        }

        float currentPositionX = this.gameObject.GetComponent<Transform> ().position.x;
        float currentPositionZ = this.gameObject.GetComponent<Transform> ().position.z;

        float joyPositionX = move.joystickAxis.x;
        float joyPositionY = move.joystickAxis.y;
        Debug.Log ("joyPositionX = " + joyPositionX + " joyPositionY = " + joyPositionY);

        float moveh = joyPositionX / 10;
        float movev = joyPositionY / 10;

        this.m_transform.Translate (new Vector3 (-joyPositionX/10, 0, -joyPositionY/10));
    }
}

当我开始游戏时,代码工作正常,飞机将得到控制。

然后,我通过GUI创建按钮。

单击该按钮时,Application.LoadLevel(0)将调用代码,并且级别将重新启动。

但是在我打电话Application.LoadLevel(0)重启游戏之后。EasyTouch无法控制飞机,并显示错误消息:

MissingReferenceException: The object of type 'Player' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.

我不知道为什么“玩家”将为空。“ Player”在调用后应该是init Application.LoadLevel(0),不是吗?

谢尔盖·克鲁施(Sergey Krusch)

前言

我从未使用过EasyTouch插件(幸运的是::D)。因此,我将对您在代码中看到的内容进行假设。如果我错了-对不起:)

回答

看一下这段代码:

void OnEnable(){
    Debug.Log ("OnEnable");
    EasyJoystick.On_JoystickMoveStart += HandleOn_JoystickMoveStart;
    EasyJoystick.On_JoystickMove += HandleOn_JoystickMove;
    EasyJoystick.On_JoystickMoveEnd += HandleOn_JoystickMoveEnd;
}

看起来EasyJoystick是一个静态类。您正在这里订阅静态事件。然后在调用Application.LoadLevel()您的Player的实例后将标记为已销毁。但是,订阅没有去任何地方,一旦EasyJoystick事件(火灾的一个On_JoystickMoveStartOn_JoystickMoveOn_JoystickMoveEnd相应的方法)( HandleOn_JoystickMoveStartHandleOn_JoystickMoveHandleOn_JoystickMoveEnd)被调用。这就是为什么您会得到例外。它很可能被这一行抛出(我错了吗?

float currentPositionX = this.gameObject.GetComponent<Transform> ().position.x;

为了解决该问题,您需要Player从调用之前提到的事件中取消预订实例Application.LoadLevel()

边注

这个:

float currentPositionX = this.gameObject.GetComponent<Transform> ().position.x;

可以重写为:

float currentPositionX = transform.position.x;

虽然currentPositionXcurrentPositionY根本没有使用:D

编辑。如何退订

像这样:

void OnDisable(){
    Debug.Log ("OnDisable");
    EasyJoystick.On_JoystickMoveStart –= HandleOn_JoystickMoveStart;
    EasyJoystick.On_JoystickMove –= HandleOn_JoystickMove;
    EasyJoystick.On_JoystickMoveEnd –= HandleOn_JoystickMoveEnd;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章