using UnityEngine; using System.Collections; [ExecuteInEditMode] public class Follower : MonoBehaviour { public Transform leader; public bool position = true; public bool rotation = true; public bool scaling = true; public bool useInitRotation = true; public float pos_duration = 0.2f; public float rot_duration = 0.2f; public float scale_duration = 0.2f; Quaternion initialRotate = Quaternion.identity; Vector3 TargetPosition { get { if (leader == null) return Vector3.zero; if (biasMode == BiasMode.WorldSpace) return leader.position + bias; else return leader.TransformPoint(bias); } } public Vector3 bias; public enum BiasMode { TargetLocalSpace, WorldSpace } public BiasMode biasMode = BiasMode.WorldSpace; // Use this for initialization void Start () { //game.hideFlags = HideFlags.DontSave; if(useInitRotation) initialRotate = transform.rotation; } // Update is called once per frame void Update () { if (leader == null) return; float pos_step = Mathf.Clamp01(Time.deltaTime / pos_duration); float rot_step = Mathf.Clamp01(Time.deltaTime / rot_duration); float scale_step = Mathf.Clamp01(Time.deltaTime / scale_duration); if (Application.isPlaying == false) pos_step = rot_step = scale_step = 1.0f; if (position) transform.position = Vector3.Lerp(transform.position, TargetPosition, pos_step); if (rotation) transform.rotation = Quaternion.Slerp(transform.rotation, leader.rotation * initialRotate, rot_step); if(scaling) transform.localScale = Vector3.Lerp(transform.localScale, leader.localScale, scale_step); } private void OnDestroy() { transform.rotation = initialRotate; } void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawLine(transform.position, transform.position + transform.right); Gizmos.color = Color.green; Gizmos.DrawLine(transform.position, transform.position + transform.up); Gizmos.color = Color.blue; Gizmos.DrawLine(transform.position, transform.position + transform.forward); } }