Unity Editor произвольно зависает в режиме воспроизведения - PullRequest
0 голосов
/ 04 июля 2019

Редактор Unity зависает, когда я перемещаю персонажа (неважно, какой), но это не всегда происходит, я все еще не мог определить точный триггер, который заставляет его зависать, но это всегда происходит после того, как я щелкаю мышью на плитке для перемещения персонажа. Вот соответствующая часть кода:

public class TacticsMove : MonoBehaviour {

public LayerMask tileLayer;

private bool moving = false;
private bool jumping = false;
private bool jumpingUp = false;
private bool movingEdge = false;
private bool fallingDown = false;

public float moveSpeed = 2;
public float jumpVelocity = 4.5f;

private Vector3 velocity = new Vector3();
private Vector3 heading = new Vector3();
private Vector3 jumpTarget;

private Unit unit;

private Queue<Tile> path;
private List<Tile> walkableTiles;


void Start(){
    unit = GetComponent<Unit>();
}

void Update(){
    if(moving){
        Walk();
    } else if(this.gameObject == TurnManager.GetActiveUnit()) {
        CheckMouse();
    }
}

private void CheckMouse(){
    if(Input.GetMouseButtonUp(0)){
        Debug.Log("Check Mouse");
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        Debug.Log("1");
        if(Physics.Raycast(ray, out hit, Mathf.Infinity, tileLayer)){
            Debug.Log("2");
            if(hit.collider.tag == "Tile") {
                Debug.Log("3");
                Tile t = hit.collider.GetComponent<Tile>();
                if(t.moveable){
                    Debug.Log("4");
                    MoveTo(t);
                }
            }
        } else {
            Debug.Log("8");
        }
    }
    Debug.Log("5");
    if(Input.GetButtonDown("Cancel")){
        Debug.Log("6");
        MovingCleanUp();
    }
    Debug.Log("7");
}

public void PrepareMovement(){
    Debug.Log("PrepareMovement");
    unit.GetCurrentTile().current = true;
    int range = (int)(unit.GetCurrentAP() / unit.apToMove.Value);
    walkableTiles = unit.GetCurrentTile().TilesInRange(unit.jumpHeight.Value, false, range);
    foreach(Tile tile in walkableTiles){
        tile.moveable = true;
    }
}

public void MoveTo(Tile target){
    Debug.Log("MoveTo");
    SetStateToMoving(true);
    unit.GetCurrentTile().current = false;
    path = CreatePath(target);
    int apCost = (int)(path.Count * unit.apToMove.Value);
    unit.ReduceAP(apCost);
}

private void Walk(){
    Debug.Log("Walk");
    if (path.Count>0){
        Tile t = path.Peek();
        Vector3 target = t.transform.position;
        // target.y += (halfHeight  + t.GetComponent<Collider>().bounds.extents.y)* transform.localScale.y;
        target.y += t.GetComponent<Collider>().bounds.extents.y;

        if(Vector3.Distance(transform.position, target) >= 0.05f) {
            // jumping = transform.position.y != target.y; //correto
            SetStateToJumping(transform.position.y != target.y);
            if(jumping){
                Jump(target);
            } else{
                CalculateHeading(target);
                SetHorizontalVelocity();
            }

            transform.forward = heading;
            transform.position += velocity * Time.deltaTime;

        } else{
            //Tile center reached
            transform.position = target;
            path.Dequeue();
        }

    } else {
        MovingCleanUp();
    }
}

private Queue<Tile> CreatePath(Tile target){
    Debug.Log("CreatePath");
    Queue<Tile> path = new Queue<Tile>();
    Tile closest = unit.GetCurrentTile();
    while(closest != target){
        foreach(Tile t in closest.FindNeighbors(unit.jumpHeight.Value, false)){
            if(Vector3.Distance(t.transform.position, target.transform.position) < Vector3.Distance(closest.transform.position, target.transform.position)){
                closest = t;
            }
        }
        path.Enqueue(closest);
    }
    return path;
}

}

Вот весь сценарий: https://pastebin.com/CD0xR120

Понятия не имею, как это отладить, поскольку сообщений об ошибках нет, просто зависает, как показывает этот GIF: https://imgur.com/a/TGhy9CS

Вот что происходит в коде:

  1. Игрок нажимает кнопку «Переместить», и кнопка вызывает метод PrepareMovement
  2. В методе обновления функция CheckMouse проверяет, щелкнул ли пользователь на подвижной плитке (синей)
  3. если игрок нажимает на подвижную плитку, вызывается функция MoveTo, которая создает путь для прохождения персонажа, а затем переводит его в состояние moving = true
  4. метод обновления всегда проверяет, движется ли состояние персонажа, вызывается ли функция Walk и заставляет ли персонажа идти к месту назначения.

Все работало нормально, это первый сценарий, который я написал для этой игры, потом все работало, я работал над другими вещами, и все шло хорошо, пока из ниоткуда не началось внезапное зависание.

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

  • Обновление версии Unity с 2018 по 2019
  • Запуск проекта с нуля и добавление всего минимального, чтобы персонаж шел
  • Удаление из персонажа всех других скриптов, кроме того, который заставляет его ходить
  • Удаление анимации ходьбы

Я понятия не имею, что еще делать, любая помощь очень ценится, даже если я каким-то образом могу получить больше информации по этой проблеме (возможно, файл журнала, о котором я не знаю). Все, что я нашел здесь, на форуме Unity orn google, похоже, указывает на бесконечный цикл, который я не считаю своим делом ...

Спасибо за вашу помощь и внимание!

ОБНОВЛЕНИЯ : код обновляется сообщениями отладки в каждом методе, вот вывод консоли при зависании:

[11:38:53] 5                    (78)
[11:38:53] 7                    (78)
[11:38:52] PrepareMovement      (1)
[11:38:52] Check Mouse          (1)
[11:38:52] 1                    (1)
[11:38:52] 8                    (1)

(Я бы сделал снимок экрана, но оказывается, что вы не можете, если окно не отвечает ...) Итак, из этого вывода консоли я могу только заключить, что строка, заставляющая его заморозиться, выглядит так:

if(Physics.Raycast(ray, out hit, Mathf.Infinity, tileLayer)){

но я понятия не имею, как радиопередача может заморозить единство ...

...