#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.