EasyTouch关于unity3d错误
本文关键字:错误 unity3d 关于 EasyTouch | 更新日期: 2023-09-27 18:04:38
我使用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.
我想知道为什么"玩家"将是空的。"玩家"应该在称为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_JoystickMoveStart
、On_JoystickMove
或On_JoystickMoveEnd
),相应的方法(HandleOn_JoystickMoveStart
、HandleOn_JoystickMove
或HandleOn_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;
虽然currentPositionX
和currentPositionY
根本没有使用:D
像这样:
void OnDisable(){
Debug.Log ("OnDisable");
EasyJoystick.On_JoystickMoveStart –= HandleOn_JoystickMoveStart;
EasyJoystick.On_JoystickMove –= HandleOn_JoystickMove;
EasyJoystick.On_JoystickMoveEnd –= HandleOn_JoystickMoveEnd;
}
标题>标题>标题>