static float MultiSineFunction(float x,float t){ float f = Mathf.Sin ( Mathf.PI * (x +t)); f += Mathf.Sin (2 * Mathf.PI * (x +2f* t)) / 2; f *= 2f / 3f; return f; }
public class SineLine : MonoBehaviour { public int CubeCount = 100; public GameObject Cuber;//预设Cube private Transform[] cubes;//记录Cube,用来波动 void Awake(){ cubes = new Transform[CubeCount]; for (int i = 0; i < CubeCount; i++) { //将所有的cube限制在[-1,1]之间 Transform go = Instantiate (Cuber).transform; go.localScale = Vector3.one / CubeCount * 2; Vector3 pos = Vector3.one; //在[0,1]范围,x=0会有半边在框框外,所以+0.5偏移一下再除以数量,再-0.5后*2变换范围为[-1,1] pos.x = ((i + 0.5f) / CubeCount - 0.5f) * 2; go.SetParent (transform); go.localPosition = pos; cubes [i] = go; } } void Update () { for (int i = 0; i < CubeCount; i++) { Vector3 pos = cubes [i].localPosition; //cube被限制在[-1,1]之间,差值为2,乘于PI后刚好为一周 pos.y = Mathf.Sin (Mathf.PI * (pos.x + Time.time)); cubes [i].localPosition = pos; } } }
使用quaternion旋转 四元数
void RotateToTarget(Vector3 targetPos){ Vector3 currentPosition=this.transform.position; Quaternion currentRotation=this.transform.rotation; Vector3 direction=(targetPos-currentPosition).normalized; Quaternion targetRotation=Quaternion.LookRotation(direction); transform.rotation=Quaternion.RotateTowards(currentRotation,targetRotation,45f*Time.deltaTime); } Quaternion.FromToRotation()//计算两个旋转的差值
void MoveToTarget(Vector3 targetPos){ if(Vector3.Distance(transform.position,targetPos)>1){ Vector3 direction=targetPos-transform.position; direction=direction.normalized; this.tranform.Translate(direction*Time.deltaTime,Space.World); } }
public AnimationCurve animCurve; float outputY = 0; void Update(){ outputY = animCurve.Evaluate(Time.time); transform.position = new Vector3(transform.position.x+Time.deltaTime,outputY,transform.position.z); }