c# - EasyTouch关于unity3d错​​误

标签 c# unity-game-engine

我正在使用 Unity3D 创建演示。 演示是这样的:使用EasyTouch控制名为“玩家”的游戏对象——飞机的运动。

创建 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”将为空。 “Player”应该在调用 Application.LoadLevel(0) 之后初始化,不是吗?

最佳答案

序言

我从未使用过这个 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;

为了解决此问题,您需要在调用 Application.LoadLevel() 之前取消订阅 Player 实例所提到的事件。

旁注

这个:

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;
}

关于c# - EasyTouch关于unity3d错​​误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23820650/

相关文章:

unity-game-engine - 如何防止字符重叠

c# - 将并行扩展或并行 LINQ 与 LINQ Take 结合使用

c# - 将锁定防止通过反射完成的更改

c# - 如何在处理大量数据时保持响应式 UI?

c# - 验证十进制数据类型时出错

c# - 输入验证错误类未添加到自定义 HtmlHelper 扩展方法中

javascript - Unity导入原生javascript作为jslib

c# - 如何更改四元数的 "angle"但保持其方向。 (统一)

unity-game-engine - 为什么在unity中实例化刚体而不是gameObject?

unity-game-engine - "stamp"正确的是 Unity 中游戏对象上的图像吗?