Ссылка на компонент аниматора, не отображаемый в инспекторе

#c# #unity3d #reference #inspector

#c# #unity3d #ссылка #инспектор

Вопрос:

Я уже пытался разобраться в этом… но не повезло..

Средства визуализации спрайтов и ссылки на движки работают нормально, они отображаются в инспекторе так, как я хочу.

Однако у меня возникли проблемы в ФАЙЛЕ 2, я не уверен, как сериализовать аниматор в инспекторе.

ФАЙЛ 1

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "EnemyConfig", menuName =  "Enemies/Enemy config", order = 0)]
public class EnemyConfig : ScriptableObject
{
    public float moverSpeed;
    //public float zRotation;
    public Sprite sprite;
    
    public Animator animator;
}
 

ФАЙЛ 2

 //EnemyController.CS
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyController : MonoBehaviour
{
    [HideInInspector]
    public EnemyConfig config;
    [SerializeField]
    private SpriteRenderer spriteRenderer;


    //Want to get a reference to the animator component appear in the inspector
    //This is my issue...--------------------------------------]

    [SerializeField]
    private GetComponent<Animator> animatorController;

    //----------------------------


    private Mover mover;
    
    private void Start()
    {
        mover = GetComponent<Mover>();
        if(mover != null)
        {
            mover.speed = config.moverSpeed;
        } 
        
        
        if(config.sprite != null)
        {
            spriteRenderer.sprite = config.sprite; 
        }
        

        // related to the animator
        if(config.animator != null)
        {
            animatorController.animator = config.animator;
        }
    }
}
 

Здесь вы можете увидеть, как ссылка на спрайт и ссылка на движок отображаются в инспекторе.
Я пытаюсь сделать то же самое с аниматором

введите описание изображения здесь

Комментарии:

1. Почему бы вам просто не опубликовать аниматор anim;?

2. Удалите это GetComponent из вашего объявления поля … сомневаюсь, что он даже компилируется без ошибок 😉 Это должно быть только [SerializeField] private Animator animatorController; .. обратите внимание, кстати, что AnimatorController это не одно и то же.. немного запутанный выбор имени

Ответ №1:

GetComponent<T> это метод, а не тип. Таким образом, вы не можете объявить поле с этим типом. Я был бы удивлен, если этот код действительно даже компилируется. То, что вы хотите, это просто

 [SerializeField]
private Animator animator;
 

Обратите внимание, что AnimatorController это класс только для редактора; вы не можете включить его в свой игровой код. Следовательно, почему вы хотите Animator здесь.

Еще одна вещь, которую следует учитывать, будет ли компонент Animator находиться в том же игровом объекте? Если это так, вам не нужно сериализовать ссылку — это было бы полезно только в том случае, если она будет находиться на другом игровом объекте, и вам нужно сохранить эту ссылку во время редактирования.

Если компонент Animator находится на том же объекте, вы можете сделать это:

 private Animator animator;

void Start()
{
    animator = GetComponent<Animator>();
}
 

Преимущество в том, что вам не нужно следить за тем, чтобы ссылка оставалась актуальной, она будет подключаться всякий раз, когда начинается игровой процесс. Это, кстати, правильное использование GetComponent<T> — поскольку это метод, вы можете вызвать его в другом методе, а не там, где он был у вас в File2.