using UnityEngine; using System.Collections; using System.Collections.Generic; public class RollOffTrace : MonoBehaviour { public Transform[] objs; public float[] rotates; public float time = 1; public float height = 2; public float rolloff = 0.3f; public bool faceToTarget = true; public float dist = 0; private float time_count = 0; private List objs2; private List objs3; private List lastPosition; private float real_height = 0; // Use this for initialization void Awake () { time_count = 0; objs2 = new List(); objs3 = new List(); lastPosition = new List(); for (int i = 0; i < objs.Length; i++) { objs[i].transform.localPosition = Vector3.zero; objs[i].transform.localScale = Vector3.one; objs[i].transform.rotation = Quaternion.AngleAxis(rotates[i], gameObject.transform.forward); Transform t1 = objs[i].GetChild(0); t1.localPosition = Vector3.zero; t1.localScale = Vector3.one; t1.localRotation = Quaternion.AngleAxis(90, Vector3.up); objs2.Add(t1); Transform t2 = objs[i].GetChild(1); //if(t != null) { t2.localPosition = Vector3.zero; t2.localScale = Vector3.one; t2.localRotation = Quaternion.AngleAxis(90, Vector3.up); objs3.Add(t2); } lastPosition.Add(objs2[i].position); } } public void Reset() { time_count = 0; real_height = height * dist; for (int i = 0; i < objs.Length; i++) { objs[i].transform.localPosition = Vector3.zero; objs[i].transform.localScale = Vector3.one; objs[i].transform.rotation = Quaternion.AngleAxis(rotates[i], gameObject.transform.forward); Transform t1 = objs2[i]; t1.localPosition = Vector3.zero; t1.localScale = Vector3.one; t1.localRotation = Quaternion.AngleAxis(90, Vector3.up); Transform t2 = objs3[i]; //if(t != null) { t2.localPosition = Vector3.zero; t2.localScale = Vector3.one; t2.localRotation = Quaternion.AngleAxis(90, Vector3.up); } lastPosition[i] = (objs2[i].position); } } // Update is called once per frame void Update () { time_count += Time.deltaTime; float t = time_count / time; if (t > 1) return; if(t <= rolloff)//上升阶段 { Vector3 pos = Vector3.up * real_height * Mathf.Sin(t / rolloff * Mathf.PI / 2); for (int i = 0; i < objs.Length; i++) { objs2[i].transform.localPosition = pos; //if(i < objs3.Count -1 && objs3[i] != null) objs3[i].transform.localPosition = pos; //objs2[i].transform.localRotation = Quaternion.AngleAxis(rotates[i], Vector3.up); if (faceToTarget) { objs2[i].transform.forward = objs2[i].transform.position - lastPosition[i]; lastPosition[i] = objs2[i].transform.position; } } } else//下降阶段 { Vector3 pos = Vector3.up * real_height * Mathf.Cos((t- rolloff) / (1-rolloff) * 0.5f * Mathf.PI); for (int i = 0; i < objs.Length; i++) { objs2[i].transform.localPosition = pos; //if (i < objs3.Count - 1 && objs3[i] != null) objs3[i].transform.localPosition = pos; //objs2[i].transform.localRotation = Quaternion.AngleAxis(rotates[i], Vector3.up); if (faceToTarget) { objs2[i].transform.forward = objs2[i].transform.position - lastPosition[i]; lastPosition[i] = objs2[i].transform.position; } } } } }