我正在使用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)
,不是吗?
我从未使用过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;
为了解决该问题,您需要Player
从调用之前提到的事件中取消预订实例Application.LoadLevel()
。
这个:
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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句