#unity3d #animationcontroller
#unity3d #animationcontroller
Вопрос:
В настоящее время я изучаю unity с помощью c #, и я сделал следующий код, используя чей-то учебник, но я думаю, что учебник, который я сейчас использую в качестве ссылки, не дает мне много информации об этой текущей ошибке. Я уже добавил bool с именем dead, который я поместил в FixedUpdate() и Update(), чтобы проверить, принимать ввод или нет. Это хорошо работает, если я умираю без нажатия клавиш направления, например, умираю во время атаки и умираю в режиме ожидания… Я хочу знать, что не так с моим кодом. Я был бы очень рад некоторым подсказкам. Вот мой код на c #.
PlayerManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerManager : MonoBehaviour
{
Rigidbody rb;
public float x, y, ms = 3;
Animator animator;
public Collider weaponCollider;
public PlayerUIManager playerUIManager;
public int maxHp = 100;
public int hp;
bool dead;
// Start is called before the first frame update
void Start()
{
hp = maxHp;
ms = 3;
playerUIManager.Init(this);
rb = GetComponent<Rigidbody>();
animator = GetComponent<Animator>();
DisableWeaponCollider();
}
void Update()
{
if (dead) return;
x = Input.GetAxisRaw("Horizontal");
y = Input.GetAxisRaw("Vertical");
if(Input.GetKeyDown(KeyCode.Space))
{
animator.SetTrigger("Attack");
}
}
void GetDamage(int damage)
{
hp -= damage;
if (hp <= 0)
{
hp = 0;
dead = true;
animator.SetTrigger("Die");
}
playerUIManager.UpdateHp(hp);
}
private void FixedUpdate()
{
if (dead) return;
Debug.Log("fixed updating");
Vector3 velocity = new Vector3(x, 0, y) * 0.29f;
Vector3 direction = transform.position velocity;
transform.LookAt(direction);
rb.velocity = velocity;
animator.SetFloat("Speed", rb.velocity.magnitude);
}
private void OnTriggerEnter(Collider other)
{
if (dead) return;
Damager damager = other.GetComponent<Damager>();
if (damager != null)
{
animator.SetTrigger("DamageReceive");
GetDamage(damager.damage);
}
}
public void EnableWeaponCollider()
{
weaponCollider.enabled = true;
}
public void DisableWeaponCollider()
{
weaponCollider.enabled = false;
}
}
DieBehavior.cs (для моей анимации смерти)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DieBehavior : StateMachineBehaviour
{
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
animator.GetComponent<PlayerManager>().ms = 0;
}
//override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{}
//override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{}
//override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{}
//override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
//{}
}
Ответ №1:
Проблема возникает из-за rb.velocity
того, что она все еще установлена.
Поэтому вам нужно сбросить скорость вместе, когда вы устанавливаете мертвый флаг.
if (hp <= 0)
{
hp = 0;
dead = true;
animator.SetTrigger("Die");
// Please add this
rb.velocity = Vector3.zero;
}
Rigidbody.velocity
ни разу не сработало. Это означает, что как только вы установите скорость, игровой объект будет двигаться до тех пор, пока вы не сбросите скорость.
Rigidbody.velocity
представляет собой скорость изменения положения твердого тела.
Комментарии:
1. Большое вам спасибо!, есть какие-нибудь советы по отладке и поиску подобных ошибок?
2. Чтобы легко найти решение, вам нужно следовать потоку кода шаг за шагом. В этом случае у вас возникла проблема с перемещением игрока. Итак, прежде всего, я проверил, какой метод вы использовали, чтобы заставить игрока двигаться. Как только я обнаружил, что вы используете скорость, я снова проверил, где вы установили мертвый флаг. Там я заметил, что вы не сбросили скорость.