Редактор 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
Вот что происходит в коде:
- Игрок нажимает кнопку «Переместить», и кнопка вызывает метод PrepareMovement
- В методе обновления функция CheckMouse проверяет, щелкнул ли пользователь на подвижной плитке (синей)
- если игрок нажимает на подвижную плитку, вызывается функция MoveTo, которая создает путь для прохождения персонажа, а затем переводит его в состояние moving = true
- метод обновления всегда проверяет, движется ли состояние персонажа, вызывается ли функция 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)){
но я понятия не имею, как радиопередача может заморозить единство ...