我一直在尝试找出一种方法,通过使用整数来根据 horizontalInput 的值切换动画。我遇到了一个问题,其中包含错误“CS0165”。
public class PlayerMovement : MonoBehaviour
{
float horizontalInput;
public float runSpeed = 3.0f;
float verticalInput;
private Animator anim;
private enum MovementState { Soldier, Running }
// Start is called before the first frame update
void Start()
{
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
//Movement
horizontalInput = Input.GetAxisRaw("Horizontal");
transform.Translate(Vector2.right * Time.deltaTime * runSpeed * horizontalInput);
verticalInput = Input.GetAxisRaw("Vertical");
transform.Translate(Vector2.up * Time.deltaTime * runSpeed * verticalInput);
//Switching Animations
MovementState state;
if (horizontalInput > 0f)
{
state = MovementState.Running;
}
else if (horizontalInput < 0f)
{
state = MovementState.Running;
}
anim.SetInteger("state", (int)state);
我一直在试图理解我的代码有什么问题,但似乎无法弄清楚我遗漏了什么。尝试将“state”添加为变量,但这只会产生其他错误,所以我真的不确定该怎么做,如果你们中的任何人能指出问题所在,我将非常感激。
(附:我对编码还很陌生,还有很多东西要学)。
谢谢!
我认为错误是
anim
没有被初始化。
你在
Start
方法中这样做,但编译器不知道你程序的生命周期。
您可以执行
private Animator anim = null;
并在anim
(或方法之上)中使用它之前检查Update
是否不为空
问题是您正在定义一个没有默认值的变量
state
。然后你有一个 if
来定义它,然后是一个 else if
来定义它。但是,如果两个逻辑分支都不匹配怎么办?那么state
还是没有定义! (请注意,这仅适用于方法范围内的变量。如果您定义类范围的变量,它将具有默认值,尽管它对于任何引用类型都将为空。)
解决这个问题很简单。为
state
定义一个初始值,或者添加一个最终的 else
逻辑分支以在其他分支不匹配时将其设置为某个值。
ETA 还值得注意的是,您可以将逻辑简化为单个
!= 0f
语句,而不是两个单独的 if 检查。