Я использую версию единства: 2021.3.6f1. Я настроил индивидуальную анимацию для игрока (четырехстороннее бездействие и ходьба), и я использую два дерева смешивания, к которым скрипт обращается и изменяет переменные moveX, moveY и is_idle. Я использую новую систему ввода Unity: Скриншот новой системы ввода Unity. и Cinemachine (хотя Cinemachine не вызывает проблем). Когда я запускаю сценарий, он имеет странный эффект дрожания, как будто аниматор продолжает сбрасывать воспроизведение анимации. Ниже видео. Ссылка на видео Скриншот аниматора: Скриншот аниматора Вот код в контроллере плеера:
using UnityEngine.InputSystem;
public class PlayerController : MonoBehaviour
{
public float moveSpeed = 1f;
public ContactFilter2D movementFilter;
public float collissionOffset = 0.05f;
Vector2 inputaxis;
Vector2 movementInput;
Vector2 prevMovementInput;
Rigidbody2D rb;
Animator animator;
List<RaycastHit2D> castCollissions = new List<RaycastHit2D>();
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
}
private void FixedUpdate() {
if (movementInput != Vector2.zero){
bool success = TryMove(movementInput);
if (movementInput != prevMovementInput) {
animator.SetFloat("moveX", movementInput.x);
animator.SetFloat("moveY", movementInput.y);
prevMovementInput = movementInput;
}
if (!success){
success = TryMove(new Vector2(movementInput.x, 0));
if (!success){
success = TryMove(new Vector2(0, movementInput.y));
}
}
animator.SetBool("is_idle",false);
} else {
//animator.SetBool("is_idle", true);
}
}
private bool TryMove(Vector2 direction){
int count = rb.Cast(direction,
movementFilter,
castCollissions,
moveSpeed * Time.fixedDeltaTime + collissionOffset);
if (count == 0){
rb.MovePosition(rb.position + direction * moveSpeed * Time.fixedDeltaTime);
return true;
} else {
return false;
}
}
void UpdateAnimation_DONT_USE(){
// this is my origional function that would be called when I didn't have a blend tre
//animation direction
if (movementInput.x == 0.00d){
if (movementInput.y ==1.00d){
//up
animator.SetInteger("direction",1);
}
}else if (movementInput.x == 1.00d) {
if (movementInput.y == 0.00d){
//right
animator.SetInteger("direction",2);
}
}else if (movementInput.x == 0.00d) {
if (movementInput.y == -1.00d){
//down
animator.SetInteger("direction",3);
}
}else if (movementInput.x == -1.00d){
if (movementInput.y == 0.00d){
//left
animator.SetInteger("direction",4);
}
}
}
void OnMove(InputValue movementValue) {
movementInput = movementValue.Get<Vector2>();
}
}
Видео с ютуба, которое я использовал Во-первых, у меня было много стрелок перехода от блока «Любое состояние» ко всем фазам анимации. Когда я попробовал это, произошел тот же результат. Затем я посмотрел другое видео на YouTube, в котором показано, как использовать дерево смешивания Я до сих пор не знаю, в чем проблема, перепробовав много разных вещей. Если кто-то может помочь, это было бы очень признательно. :)
Можете ли вы вставить лог в свои проверки на !success и поделиться результатами?
Мой журнал игрока пуст, но журнал редактора огромен, и я не знаю, как его проверить. Мои анимационные переходы выглядят так: imgur.com/a/mcK6Sk3
Просто вставьте Debug.Log в !success testing, я думаю, что вы делаете двойное движение, и это может вызвать дрожание
Извините за назойливость, но где в сценарии это указать?
Внутри вашего if (!success), оба они и один снаружи тоже, поместите в него эту строку - Debug.Log($"A: {Time.frameCount}"); - просто измените A на что-то другое, чтобы мы могли различать их
Он ничего не делает, кроме случаев, когда я во что-то вхожу — он регистрирует игровой объект, с которым он столкнулся (ожидаемый).
Я нашел решение, означающее, что я должен переделать игру. Хотя я до сих пор не знаю, в чем проблема, я использовал систему ввода по умолчанию в новом проекте, и она отлично работает. Спасибо всем, кто пытался мне помочь! :)
Можете ли вы поделиться своими условиями перехода?