У некоторых компонент есть переключатель, используя который можно менять список видимых полей, и, соответственно, по-разному их использовать.
Пример: Light.type (
docs)
Пример: Camera.orthographic (
docs)
В 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;
}
}