@Ezekiel4
Охотник на пиратов и сборщик монолитов

Как делается изменяемый вид компонент инспектора?

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

Пример: Light.type (docs)
625c5ef33dc94614131204.png
Пример: Camera.orthographic (docs)
625c5efd892fc646677270.png

В Github Unity C# Reference нашёл соответствующие классы - LightEditor и CameraEditor. Но в обоих классах не нашёл ничего, что бы точно это делало. Есть подозрения на EditorGUI.EndProperty() и SerializedObject.ApplyModifiedProperties(), я пока только разбираюсь как это всё работает.

Хочу разобраться в вопросе на примере скрипта ниже. Сделать так, чтобы поля minX и maxX / minY и maxY были видны только если hasHorizontalBounds или hasVerticalBounds соответственно выставлены на true.
using UnityEngine;

public class CameraFollow2D : MonoBehaviour {

	[SerializeField] private Transform target;

	[Header("Following settings")]
	[SerializeField] private float cameraSmooth = 2f;
	[SerializeField] private float cameraZ = -10f;
	[SerializeField] private bool useFixedUpdate;

	[Header("Horizontal bounds")]
	[SerializeField] private bool hasHorizontalBounds;
	[SerializeField] private float minX, maxX;

	[Header("Vertical bounds")]
	[SerializeField] private bool hasVerticalBounds;
	[SerializeField] private float minY, maxY;

	public Transform Target { get; set; }
	public float CameraSmooth { get; set; }

	private void FixedUpdate() {
		if (useFixedUpdate)
			FollowTarget(Time.fixedDeltaTime);
	}

	private void LateUpdate() {
		if (!useFixedUpdate)
			FollowTarget(Time.deltaTime);
	}

	private void FollowTarget(float deltaTime) {
		Vector3 targetVector = Vector3.forward * cameraZ + target.position;

		targetVector = Vector3.Lerp(transform.position, targetVector, cameraSmooth * deltaTime);

		if (hasHorizontalBounds)
			targetVector.x = Mathf.Clamp(targetVector.x, minX, maxX);

		if (hasVerticalBounds)
			targetVector.y = Mathf.Clamp(targetVector.y, minY, maxY);

		transform.position = targetVector;
	}
}
  • Вопрос задан
  • 30 просмотров
Решения вопроса 1
freeExec
@freeExec
Участник OpenStreetMap
Точка входа там OnInspectorGUI
И все конструкции вида рисуют соответствующие элементы если требуются.
if (EditorGUILayout.BeginFadeGroup(m_AnimShowLightBounceIntensity.faded))
                settings.DrawBounceIntensity();
            EditorGUILayout.EndFadeGroup();

Никакой магии нет, только долго и нудно расписывать все варианты комбинаций.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы