Unity3D相机跟随
创建CameraFollow脚本,将其挂载于目标相机上
需求
- 相机固定角度跟随目标移动
参数化
- 跟随目标 Transform followTarget
- 偏移距离 Vector3 followOffset
- 偏移角度 Vector3 followRotation
using UnityEngine;
// [ExecuteInEditMode]
public class CameraFollow : MonoBehaviour
{
public Transform followTarget;
public Vector3 followOffset;
public Vector3 followRotation;
void Start()
{
if (followTarget == null)
followTarget = GameObject.FindWithTag("Player").transform;
}
void Update()
{
transform.position = followTarget.position + followOffset;
transform.rotation = Quaternion.Euler(followRotation);
}
// // 编辑器模式下更新
// void OnValidate()
// {
// transform.position = followTarget.position + followOffset;
// transform.rotation = Quaternion.Euler(followRotation);
// }
}
其他
修改编辑器,使用CameraFollow中的参数,完全覆盖inspection面板的参数,同时使操作在窗口可见
注:此项需要在项目根目录创建Editor文件夹,将此脚本放置于文件夹内
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(CameraFollow))]
public class CameraFollowEditor : Editor
{
private SerializedProperty followTarget;
private SerializedProperty followOffset;
private SerializedProperty followRotation;
void OnEnable()
{
if (target == null)
return;
followTarget = serializedObject.FindProperty("followTarget");
followOffset = serializedObject.FindProperty("followOffset");
followRotation = serializedObject.FindProperty("followRotation");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(followTarget);
EditorGUILayout.PropertyField(followOffset);
EditorGUILayout.PropertyField(followRotation);
serializedObject.ApplyModifiedProperties();
{
CameraFollow cameraFollow = (CameraFollow)target;
cameraFollow.transform.SetPositionAndRotation(cameraFollow.followTarget.position + cameraFollow.followOffset, Quaternion.Euler(cameraFollow.followRotation));
EditorUtility.SetDirty(cameraFollow);
}
}
}