Исправленное обновление Unity 5

В моем проекте, написанном на Unity 5, я выполняю операцию касания объекта с помощью raycast. Но, поскольку мой объект движется, иногда raycast не может достичь меня, когда я касаюсь. В качестве решения, используя фиксированное обновление, я установил фиксированный временной шаг от 0,02 до 0,01 в настройках проекта. Однако в это время он ведет себя так, как будто я касаюсь дважды, и он получает два касания. Я не должен использовать функцию обновления, и мне нужно сделать это с помощью фиксированного обновления. Как я могу решить проблему?

Ниже мой код:

   void FixedUpdate()
{
    if (PlayerPrefs.GetInt ("oyunsonu") == 0) {

        // Code for OnMouseDown in the iPhone. Unquote to test.
        RaycastHit hit = new RaycastHit ();
        for (int i = 0; i < Input.touchCount; ++i) {
            if (Input.GetTouch (i).phase.Equals (TouchPhase.Began)) {
                Ray ray = Camera.main.ScreenPointToRay (Input.GetTouch (i).position);

                touchY = Input.GetTouch (i).position.y;
                if (Physics.Raycast (ray, out hit)) {

                    //Debug.Log (hit.transform.gameObject.name.ToString ());

                    GameObject myBallObject;
                    myBallObject = GameObject.FindWithTag ("Ball");

                    Instantiate (effect, myBallObject.transform.position, transform.rotation);
                    GetComponent<AudioSource> ().PlayOneShot (saundFile [3], 1);
                    //TextAnimation.Show ();
                    TouchObjectScript myTouchObjectScript = myBallObject.GetComponent<TouchObjectScript> ();
                    myTouchObjectScript.BallForce (hit.transform.gameObject.tag.ToString (), touchY, screenHeight);

                    //PlayerPrefs.SetInt ("aaa", 0);

                }

            }
        }
    }

}

person fatih    schedule 03.06.2016    source источник
comment
никогда не изменяйте фиксированный временной шаг ни по какой причине. Во-вторых, очень маловероятно, что вам следует использовать FixedUpdate. Наконец, небольшой момент: вам абсолютно не следует выполнять PlayerPrefs.GetInt внутри цикла выполнения.   -  person Fattie    schedule 03.06.2016
comment
Вам не нужно менять фиксированный временной шаг, изменение его на меньшее значение, чем 0.016, может вызвать проблемы с физикой. Вместо этого используйте этот код в методе Update, ничто не мешает вам не использовать FixedUpdate.   -  person EvilTak    schedule 03.06.2016


Ответы (1)


Вы используете Update() для обнаружения ввода или перемещения объектов, не являющихся физическими/жесткими. Вы используете FixedUpdate() для перемещения физического объекта. Посмотрите ОБНОВЛЕНИЕ И ИСПРАВЛЕНИЕ ОБНОВЛЕНИЯ из Unity.

Делать GameObject.FindWithTag("Ball"); каждый раз, когда есть касание и raycast, нехорошо. Постоянно проверять PlayerPrefs.GetInt("oyunsonu") тоже нехорошо. Кэшируйте свои переменные, если они будут использоваться в цикле несколько раз. Ниже ваш фиксированный код.

AudioSource myAudio;
GameObject myBallObject;
TouchObjectScript myTouchObjectScript;
int oyunsonu = 0;

void Start()
{
    myAudio = GetComponent<AudioSource>();
    myBallObject = GameObject.FindWithTag("Ball");
    myTouchObjectScript = myBallObject.GetComponent<TouchObjectScript>();
    oyunsonu = PlayerPrefs.GetInt("oyunsonu");
}

void Update()
{
    if (oyunsonu == 0)
    {

        // Code for OnMouseDown in the iPhone. Unquote to test.
        RaycastHit hit = new RaycastHit();
        for (int i = 0; i < Input.touchCount; ++i)
        {
            if (Input.GetTouch(i).phase == TouchPhase.Began)
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position);

                touchY = Input.GetTouch(i).position.y;
                if (Physics.Raycast(ray, out hit))
                {
                    //Debug.Log (hit.transform.gameObject.name.ToString ());
                    Instantiate(effect, myBallObject.transform.position, transform.rotation);
                    myAudio.PlayOneShot(saundFile[3], 1);
                    //TextAnimation.Show ();
                    myTouchObjectScript.BallForce(hit.transform.gameObject.tag.ToString(), touchY, screenHeight);
                }

            }
        }
    }

}
person Programmer    schedule 03.06.2016