为什么Update()会多次调用自身?

时间:2014-09-01 12:46:21

标签: c# list count unity3d

我是Unity的新手并开发板球比赛。我有一个显示小队选择的屏幕。它显示了15个玩家的图像,其中我必须选择任何11个。

我继续在列表中添加点击的(选定的)播放器。但问题是当我点击播放器一次时,我的列表大小有时变为4或5甚至更多。我的脚本如下:

using UnityEngine;
using System.Collections;

public class bear : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        //select ();
        if (Input.touchCount == 1)
        {
            Vector3 wp = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
            Vector2 touchPos = new Vector2(wp.x, wp.y);
            if (collider2D == Physics2D.OverlapPoint(touchPos))
            {
                Material newMat = Resources.Load("New Material", typeof(Material)) as Material;
                gameObject.renderer.material = newMat;
                PlayersManager.objPlayerList.Add(PlayersManager.setPlayerObject("Bear"));
                countausplayer.countteam++;
            }
        }
    }
}

请指导我哪里出错了?为什么List大小会自行增加?

2 个答案:

答案 0 :(得分:2)

每帧都会调用更新,如果用户的手指在您的项目上并将项目添加到列表中,则您基本上会测试每一帧。如果你有一个长时间的触摸,你会得到更多的补充。

相反,您应该测试触摸是否已经结束,您可以使用TouchPhase进行此操作。

正确的 TouchPhase TouchPhase.Ended

这意味着手指从屏幕上抬起。这是触摸的最后阶段。

或者在您的代码中:

void Update () {
    //select ();
    int i = 0;
    while (i < Input.touchCount) {
        if (Input.GetTouch(i).phase == TouchPhase.Ended)
            Vector3 wp = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position);
            Vector2 touchPos = new Vector2(wp.x, wp.y);
            if (collider2D == Physics2D.OverlapPoint(touchPos))
            {
                Material newMat = Resources.Load("New Material", typeof(Material)) as Material;
                gameObject.renderer.material = newMat;
                PlayersManager.objPlayerList.Add(PlayersManager.setPlayerObject("Bear"));
                countausplayer.countteam++;
            }
        }
    }
}

答案 1 :(得分:0)

我之前的回答是错误的......

我认为你有解决方案:

您应该寻找Input.touchCount > 0 && TouchPhase.TheOneYouWant