Я пытаюсь перевести объект между другими объектами на основе нажатой клавиши, и он зависает - PullRequest
0 голосов
/ 21 мая 2019

Я создаю игру, в которой на основе нажатой кнопки объект переводится в этом направлении.Тем не менее, он замерзает.

Я пытался использовать счетчики, которые работали, но объект был бы привлечен как к объекту, с которого он начинал, так и к объекту, в котором он пытался двигаться, поэтому он "вытеснялся".

            using UnityEngine;
            using System.Collections;

            public class football : MonoBehaviour {
                public GameObject footballx;
                public GameObject dax;
                public GameObject badman;
                public GameObject aa;
                public int flip = 1;
                public float ax;
                public float ay;
                public float bx;
                public float by;
                public float fx;
                public float fy;
                public float cx;
                public float cy;
                public float dx;
                public float dy;
                public float zx;
                public float zy;
                public float aax;
                public float aay;
                public Vector3 move;

                void Start () {

                }

                void OnCollisionEnter2D (Collision2D Collection)
                {
                    if(Collection.gameObject == aa)
                    {
                        print("Interception");
                        flip=5;
                    }
                }

                void Update () {

                if(flip==1){
                    while(zy != by){
                        zx = badman.transform.position.x;
                        zy = badman.transform.position.y;
                        bx = footballx.transform.position.x;    
                        by = footballx.transform.position.y;
                        if(bx>zx){          
                            bx=bx-1;
                        }
                        if(by>zy){
                            by=by-1;
                        }
                        if(bx<zx){          
                            bx=bx+1;
                        }
                        if(by<zy){
                            by=by+1;
                        }
                        move = new Vector3(bx,by,0);
                        footballx.transform.position=move;
                        if(Input.GetKey ("=")){
                            break;
                        }
                    }
                }

                    if(flip==0){
                    while(ay != by){
                        ax = dax.transform.position.x;
                        ay = dax.transform.position.y;
                        bx = footballx.transform.position.x;    
                        by = footballx.transform.position.y;
                        if(bx>ax){          
                            bx=bx-1;
                        }
                        if(by>ay){
                            by=by-1;
                        }
                        if(bx<ax){          
                            bx=bx+1;
                        }
                        if(by<ay){
                            by=by+1;
                        }
                        move = new Vector3(bx,by,0);
                        footballx.transform.position=move;
                        if(Input.GetKey ("=")){
                            break;
                        }
                    }
                }

                    ax = dax.transform.position.x;
                    ay = dax.transform.position.y;
                    bx = footballx.transform.position.x;    
                    by = footballx.transform.position.y;

                    if(Input.GetKey("k"))
                    {   
                        flip=0; 
                    }

                    StartCoroutine(waiter());
                }

                IEnumerator waiter() {
                    yield return new WaitForSeconds(1);

                }
            }

Он должен быть в состоянии перевести на объект, но он не работает.Я также упростил код и надеюсь, что не уничтожил и не получил важную информацию.

1 Ответ

0 голосов
/ 21 мая 2019

Во-первых, здесь есть несколько мест, где вы можете улучшить свою практику кода. В частности, Unity имеет структуру под названием Vector3, которая по сути является массивом длины 3. Вместо того, чтобы иметь плавающие топоры, ay, az и т. Д., Вы можете использовать что-то вроде Vector3 acoords, и тогда у вас будет acoords.x acoords.y и acoords.z. Однако, глядя на то, что вы пытаетесь сделать, я не понимаю, зачем вам нужна какая-либо из этих переменных, и вы не можете просто изменить преобразование напрямую, вы можете сделать что-то вроде этого:

if(bcoords.x > acoords.x)
{
    footballx.transform.position = new Vector3(footballx.transform.position.x - 1, footballx.transform.position.y, footballx.transform.position.z);
}

While() Циклы, как правило, являются плохой точкой вызова вне подпрограммы в Unity, потому что они приостанавливают выполнение остальной части кода, пока цикл while повторяется. У вас есть две точки вызова здесь:

1. Поместите цикл while в подпрограмму

Что-то вроде

IEnumerator movement()
{
    //your movement code here
    yield return null;
}

2. Иметь метод, который неоднократно вызывается в цикле обновления

Вне вашего цикла обновления вы можете использовать функцию, которая может выглядеть следующим образом:

void movement(string direction)
{
    if(direction == "right")
    {
         footballx.transform.position = new Vector3(footballx.transform.position.x - 1, footballx.transform.position.y, footballx.transform.position.z);
    }
    //your other movements here
}

Затем проверка будет выполняться для каждого кадра в цикле обновления, и, таким образом, в каждом кадре будет происходить движение, но это не приведет к приостановке остальной части программы:

void Update()
{
    if(bcoords.x > acoords.x)
    {
        movement("right");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...