У меня есть простой прототип с контролируемым «деревенским жителем». У деревни есть две анимации, доступные для его аниматора - Guy_idle и Guy_walk. Ниже приведен контроллер:
В деревне есть сценагер, villager.cs , прикрепленный, который содержит следующий код анимационного и навока.
using System.Collections;
using UnityEngine;
using UnityEngine.AI;
public class Villager : MonoBehaviour
{
[SerializeField] GameObject selectedPrefab;
[SerializeField] NavMeshAgent _nma;
[SerializeField] Animator _animator;
...
IEnumerator IsWalking()
{
Debug.Log("IsWalking() started");
_animator.SetBool("Walking", true);
Debug.Log("Walking bool should be True, is actually " + _animator.GetBool("Walking"));
while (_nma.remainingDistance > _nma.stoppingDistance)
{
Debug.Log("Destination not reached, yielding...");
yield return null;
}
Debug.Log("Destination reached");
_animator.SetBool("Walking", false);
Debug.Log("Walking bool should be false, is actually " + _animator.GetBool("Walking"));
}
public void OnMove(Vector3 target)
{
Debug.Log("OnMove() called");
_nma.destination = target;
Debug.Log("Destination set to " + target);
if (!_animator.GetBool("Walking"))
{
Debug.Log("Not currently walking");
StartCoroutine("IsWalking");
}
}
Существует сценарий для обработки ввода и команд игрока, Controls.cs , прикрепленный к основной камере сцены. В нем следующий код ссылок villager.cs Когда RMB нажимается (методы onlmb (transform) , Select (Transform) и Deselect () Обработка выбора единственных деревенских жителей на LMB через выбранную переменная, которая работает нормально):
using UnityEngine;
public class Controls : MonoBehaviour
{
public Transform selected = null;
...
void OnRMB((Transform, Vector3) targetData)
{
switch (targetData.Item1.tag)
{
case "Terrain":
selected.GetComponent().OnMove(targetData.Item2);
break;
case "Tree":
selected.GetComponent().OnMove(targetData.Item1.root.position);
break;
}
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
OnLMB(Target().Item1);
}
if (Input.GetMouseButtonDown(1) && selected != null)
{
OnRMB(Target());
}
}
< /code>
В режиме воспроизведения, проблема представляет собой, что деревенский житель иногда (примерно в половине времени) не может играть в Guy_walk для любой ощутимой продолжительности вдоль данного путешествия. Это кажется случайным, за исключением некоторых обстоятельств: < /p>
Использование Navmeshagent для перемещения жителей деревни, я построил дерево переключения /корпуса, чтобы определить, как ведут себя жители деревни, когда сказали, чтобы перейти к каждому типу «цели». В настоящее время единственными двумя целевыми типами являются местность и дерево. Луч отбрасывается от камеры в курсор, а GameObject.comParetag (String) используется для определения целевого типа. Если местность, пункт назначения установлена на попадание. Точка Raycast (где курсор был при ударе RMB). Но если дерево, пункт назначения устанавливается на положение корневого преобразования этого дерева (то есть подходите как можно ближе к стволу этого дерева, для измельчения). Всякий раз, когда житель деревни предлагается пойти на дерево (щелкнув правой кнопкой мыши по любой части какого-либо части дерева), этот деревенский житель не будет играть в Guy_walk для этого путешествия. Остановки, и они возвращаются в Guy_IDLE. Guy_idle играет). Иногда это случается, но, кажется, терпит неудачу примерно в половине времени. Я пытался добавить журналы отладки в консоль, чтобы увидеть, смогу ли я сузить дело, но что -то в этой проблеме оказывается неуловимым для меня. Я предполагаю, что я использую неверные столбцы или, возможно, неправильно понимать порядок операций. установить на True. Однако, тем не менее, журналы консоли говорят мне, что Bool была настроена на True (и на самом деле «на самом деле». Вот как выглядит неудачная попытка воспроизводить Guy_walk в консоли, используя Lines Debug.log (String)
У меня есть простой прототип с контролируемым «деревенским жителем». У деревни есть две анимации, доступные для его аниматора - Guy_idle и Guy_walk. Ниже приведен контроллер:
В деревне есть сценагер, villager.cs , прикрепленный, который содержит следующий код анимационного и навока.[code]using System.Collections; using UnityEngine; using UnityEngine.AI;
public class Villager : MonoBehaviour { [SerializeField] GameObject selectedPrefab; [SerializeField] NavMeshAgent _nma; [SerializeField] Animator _animator;
...
IEnumerator IsWalking() { Debug.Log("IsWalking() started"); _animator.SetBool("Walking", true); Debug.Log("Walking bool should be True, is actually " + _animator.GetBool("Walking")); while (_nma.remainingDistance > _nma.stoppingDistance) { Debug.Log("Destination not reached, yielding..."); yield return null; } Debug.Log("Destination reached"); _animator.SetBool("Walking", false); Debug.Log("Walking bool should be false, is actually " + _animator.GetBool("Walking")); }
public void OnMove(Vector3 target) { Debug.Log("OnMove() called"); _nma.destination = target; Debug.Log("Destination set to " + target); if (!_animator.GetBool("Walking")) { Debug.Log("Not currently walking"); StartCoroutine("IsWalking"); } } [/code] Существует сценарий для обработки ввода и команд игрока, Controls.cs , прикрепленный к основной камере сцены. В нем следующий код ссылок villager.cs Когда RMB нажимается (методы onlmb (transform) , Select (Transform) и Deselect () Обработка выбора единственных деревенских жителей на LMB через выбранную переменная, которая работает нормально): [code]using UnityEngine;
public class Controls : MonoBehaviour { public Transform selected = null;
...
void OnRMB((Transform, Vector3) targetData) { switch (targetData.Item1.tag) { case "Terrain": selected.GetComponent().OnMove(targetData.Item2); break; case "Tree": selected.GetComponent().OnMove(targetData.Item1.root.position); break; } }
void Update() { if (Input.GetMouseButtonDown(0)) { OnLMB(Target().Item1); }
if (Input.GetMouseButtonDown(1) && selected != null) { OnRMB(Target()); } } < /code> В режиме воспроизведения, проблема представляет собой, что деревенский житель иногда (примерно в половине времени) не может играть в Guy_walk для любой ощутимой продолжительности вдоль данного путешествия. Это кажется случайным, за исключением некоторых обстоятельств: < /p>
Использование Navmeshagent для перемещения жителей деревни, я построил дерево переключения /корпуса, чтобы определить, как ведут себя жители деревни, когда сказали, чтобы перейти к каждому типу «цели». В настоящее время единственными двумя целевыми типами являются местность и дерево. Луч отбрасывается от камеры в курсор, а GameObject.comParetag (String) используется для определения целевого типа. Если местность, пункт назначения установлена на попадание. Точка Raycast (где курсор был при ударе RMB). Но если дерево, пункт назначения устанавливается на положение корневого преобразования этого дерева (то есть подходите как можно ближе к стволу этого дерева, для измельчения). Всякий раз, когда житель деревни предлагается пойти на дерево (щелкнув правой кнопкой мыши по любой части какого-либо части дерева), этот деревенский житель не будет играть в Guy_walk для этого путешествия. Остановки, и они возвращаются в Guy_IDLE. Guy_idle играет). Иногда это случается, но, кажется, терпит неудачу примерно в половине времени. Я пытался добавить журналы отладки в консоль, чтобы увидеть, смогу ли я сузить дело, но что -то в этой проблеме оказывается неуловимым для меня. Я предполагаю, что я использую неверные столбцы или, возможно, неправильно понимать порядок операций. установить на True. Однако, тем не менее, журналы консоли говорят мне, что Bool была настроена на True (и на самом деле «на самом деле». Вот как выглядит неудачная попытка воспроизводить Guy_walk в консоли, используя Lines Debug.log (String) [/code] в коде выше: