这是错误deltaVector = (Vector3)Input.GetTouch(0).position - transform.position;
完整代码:
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class JoystickController :
MonoBehaviour, IPointerUpHandler, IPointerDownHandler {
public ControllerInput tankPlayer;
public float offset = 35.0f;
public Sprite button_not_touch;
public Sprite button_touch;
public Image[] imageButtons;
private bool isTouch;
private Vector3 deltaVector;
void Update()
{
// When touch, process touch postion
if (isTouch) {
// Check touch, if have mutiple touch
Touch[] myTouchs = Input.touches;
Vector3 touchPos = Vector3.zero;
if (myTouchs.Length > 1) {
for (int i = 0; i < myTouchs.Length; i++)
{
if (myTouchs[i].position.y < transform.position.y * 2 && myTouchs[i].position.x < transform.position.x * 2) {
touchPos = myTouchs[i].position;
break;
}
}
deltaVector = touchPos - transform.position;
}
else
deltaVector = (Vector3)Input.GetTouch(0).position - transform.position;
Debug.Log("log");
// Process when magnitude delta vector greater than 25
if (Vector3.Magnitude(deltaVector) > 25.0f) {
if (Mathf.Abs(deltaVector.x) > Mathf.Abs(deltaVector.y)) {
// Move horizontal
if (deltaVector.x > offset) {
tankPlayer.MoveRight();
ButtonHit(3);
} else if (deltaVector.x < -offset) {
tankPlayer.MoveLeft();
ButtonHit(1);
}
} else {
// Move vertical
if (deltaVector.y > offset) {
tankPlayer.MoveUp();
ButtonHit(0);
} else if (deltaVector.y < -offset) {
tankPlayer.MoveDown();
ButtonHit(2);
}
}
} else
tankPlayer.Release();
} else
tankPlayer.Release();
}
// Method to change button sprites
void ButtonHit(int indexTouch)
{
foreach(Image image in imageButtons)
image.sprite = button_not_touch;
imageButtons[indexTouch].sprite = button_touch;
}
// Event handle when touch to joystick
public void OnPointerUp(PointerEventData eventData )
{
foreach(Image image in imageButtons)
image.sprite = button_not_touch;
isTouch = false;
}
// Event handle when touch to joystick
public void OnPointerDown(PointerEventData eventData)
{
isTouch = true;
}
void OnDisable()
{
tankPlayer.Release();
}
}
答案 0 :(得分:2)
您应该检查myTouchs
是否至少包含一个元素。实际上,即使myTouchs
为空,也可以输入else分支,这会引发异常。
答案 1 :(得分:0)
如果myTouchs.Length&lt; 1这意味着myTouchs包含0个元素。
因此,如果您执行Input.GetTouch(0),它将返回null,因为GetTouch数组中没有Touch avaliable
在你的其他地方加上这个条件
else if( myTouchs.Length == 1)
//your code
或将您的初始if更改为
if (myTouchs.Length >= 1)
更改else应该看起来像
if (myTouchs.Length > 1) {
for (int i = 0; i < myTouchs.Length; i++)
{
if (myTouchs[i].position.y < transform.position.y * 2 && myTouchs[i].position.x < transform.position.x * 2) {
touchPos = myTouchs[i].position;
break;
}
}
deltaVector = touchPos - transform.position;
}
else if( myTouchs.Length == 1)