You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.4 KiB
104 lines
3.4 KiB
using System; |
|
using UnityEngine; |
|
|
|
namespace UnityStandardAssets.Cameras |
|
{ |
|
public abstract class AbstractTargetFollower : MonoBehaviour |
|
{ |
|
public enum UpdateType // The available methods of updating are: |
|
{ |
|
FixedUpdate, // Update in FixedUpdate (for tracking rigidbodies). |
|
LateUpdate, // Update in LateUpdate. (for tracking objects that are moved in Update) |
|
ManualUpdate, // user must call to update camera |
|
} |
|
|
|
[SerializeField] protected Transform m_Target; // The target object to follow |
|
[SerializeField] private bool m_AutoTargetPlayer = true; // Whether the rig should automatically target the player. |
|
[SerializeField] private UpdateType m_UpdateType; // stores the selected update type |
|
|
|
protected Rigidbody targetRigidbody; |
|
|
|
|
|
protected virtual void Start() |
|
{ |
|
// if auto targeting is used, find the object tagged "Player" |
|
// any class inheriting from this should call base.Start() to perform this action! |
|
if (m_AutoTargetPlayer) |
|
{ |
|
FindAndTargetPlayer(); |
|
} |
|
if (m_Target == null) return; |
|
targetRigidbody = m_Target.GetComponent<Rigidbody>(); |
|
} |
|
|
|
|
|
private void FixedUpdate() |
|
{ |
|
// we update from here if updatetype is set to Fixed, or in auto mode, |
|
// if the target has a rigidbody, and isn't kinematic. |
|
if (m_AutoTargetPlayer && (m_Target == null || !m_Target.gameObject.activeSelf)) |
|
{ |
|
FindAndTargetPlayer(); |
|
} |
|
if (m_UpdateType == UpdateType.FixedUpdate) |
|
{ |
|
FollowTarget(Time.deltaTime); |
|
} |
|
} |
|
|
|
|
|
private void LateUpdate() |
|
{ |
|
// we update from here if updatetype is set to Late, or in auto mode, |
|
// if the target does not have a rigidbody, or - does have a rigidbody but is set to kinematic. |
|
if (m_AutoTargetPlayer && (m_Target == null || !m_Target.gameObject.activeSelf)) |
|
{ |
|
FindAndTargetPlayer(); |
|
} |
|
if (m_UpdateType == UpdateType.LateUpdate) |
|
{ |
|
FollowTarget(Time.deltaTime); |
|
} |
|
} |
|
|
|
|
|
public void ManualUpdate() |
|
{ |
|
// we update from here if updatetype is set to Late, or in auto mode, |
|
// if the target does not have a rigidbody, or - does have a rigidbody but is set to kinematic. |
|
if (m_AutoTargetPlayer && (m_Target == null || !m_Target.gameObject.activeSelf)) |
|
{ |
|
FindAndTargetPlayer(); |
|
} |
|
if (m_UpdateType == UpdateType.ManualUpdate) |
|
{ |
|
FollowTarget(Time.deltaTime); |
|
} |
|
} |
|
|
|
protected abstract void FollowTarget(float deltaTime); |
|
|
|
|
|
public void FindAndTargetPlayer() |
|
{ |
|
// auto target an object tagged player, if no target has been assigned |
|
var targetObj = GameObject.FindGameObjectWithTag("Player"); |
|
if (targetObj) |
|
{ |
|
SetTarget(targetObj.transform); |
|
} |
|
} |
|
|
|
|
|
public virtual void SetTarget(Transform newTransform) |
|
{ |
|
m_Target = newTransform; |
|
} |
|
|
|
|
|
public Transform Target |
|
{ |
|
get { return m_Target; } |
|
} |
|
} |
|
}
|
|
|