Проблема с анимацией в Unity3d

323
03 мая 2022, 22:10

Прилагаю скриншот проблемы.

Думаю что проблема в том, что я склеил коды двух разных авторов, и с чем-то прогадал при редактировании.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerPlatformerController : PhysicsObject {
public float maxSpeed = 5;
public float jumpTakeOffSpeed = 8;
public AnimationClip walkAnimation;
public AnimationClip runAnimation;
public float walkAnimationSpeed;
public float runAnimationSpeed;
private bool isWalk;
private bool isRun;
private Animation _animation;
private SpriteRenderer spriteRenderer;
void Start () {
    _animation = GetComponent<Animation>();
    _animation[walkAnimation.Walk].speed = walkAnimationSpeed;
    _animation[runAnimation.Run].speed = runAnimationSpeed;
   
    }
void Awake () 
{
    spriteRenderer = GetComponent<SpriteRenderer> ();    
}
void Update () {
    if(Input.GetKeyDown (KeyCode.W)){
    isWalk = true; 
    maxSpeed = 5;
            }
            if(Input.GetKeyUp (KeyCode.W)){
    isWalk = false;
            }
            if(Input.GetKeyDown (KeyCode.LeftShift)){
    isRun = true;  
            }
            if(Input.GetKeyUp (KeyCode.LeftShift)){
    isRun = false; 
            }
            if(isWalk && !isRun){
            _animation.CrossFade (walkAnimation.Walk);     
            }
            if(isWalk && isRun){
            _animation.CrossFade (runAnimation.Run);
            maxSpeed = 8;    
            }
            if(!isWalk){
            _animation.Stop(walkAnimation.Walk);
            _animation.Stop(runAnimation.Run);
            }
}
protected override void ComputeVelocity()
{
    Vector2 move = Vector2.zero;
    move.x = Input.GetAxis ("Horizontal");
    if (Input.GetButtonDown ("Jump") && grounded) {
        velocity.y = jumpTakeOffSpeed;
    } else if (Input.GetButtonUp ("Jump")) 
    {
        if (velocity.y > 0) {
            velocity.y = velocity.y * 0.5f;
        }
    }
    bool flipSprite = (spriteRenderer.flipX ? (move.x > 0.01f) : (move.x < 0.01f));
    if (flipSprite) 
    {
        spriteRenderer.flipX = !spriteRenderer.flipX;
    }
    targetVelocity = move * maxSpeed;
}
}
Answer 1

Во-первых, если вы этого еще не сделали, то в инспекторе закиньте в переменные

public AnimationClip walkAnimation;
public AnimationClip runAnimation;

Клипы под названием Walk и Run.

Во-вторых, в методе Start() у вас первая ошибка:

_animation[walkAnimation.Walk].speed = walkAnimationSpeed;
_animation[runAnimation.Run].speed = runAnimationSpeed;

Здесь вы пытаетесь обратиться к переменной типа AnimationClip так, как будто у нее есть методы Walk и Run. Вместо этого вам нужно внимательнее посмотреть на тип, которых требуется указать в квадратный скобках (подсказка, это тип string), поэтому нужно переписать метод Start():

void Start () 
{
    _animation = GetComponent<Animation>();
    _animation[walkAnimation.name].speed = walkAnimationSpeed;
    _animation[runAnimation.name].speed = runAnimationSpeed;   
}

Далее, вам нужно исправить эту же ошибку в методе Update() и вообще везде, где вы используете _animation.CrossFade() или _animation.Stop() вам точно также в круглых скобках нужно поставить walkAnimation.name или runAnimation.name (в зависимости от требуемого), так как оба этих метода тоже принимают в качестве параметра тип string.

READ ALSO
Как изменить значение экземпляра класса или структуры изнутри самого класса или структуры?

Как изменить значение экземпляра класса или структуры изнутри самого класса или структуры?

У меня есть структура, в которой есть поле Mod, высчитываемое при инициализации:

234
Имя &#39;Ajax&#39; не существует в текущем контексте

Имя 'Ajax' не существует в текущем контексте

Следующий код @using (AjaxBeginForm("CheckChanging", new AjaxOptions { UpdateTargetId = "results" })) вызывает ошибку CS0103 Имя "Ajax" не существует в текущем контексте

153
Как реализовать передачу пакета на UDP server?

Как реализовать передачу пакета на UDP server?

Реализовать программы клиента и сервера, работающие по протоколу UDPКлиент каждые 10 секунд отправляет на сервер пакет данных

258