读一读

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;
}

1.gif


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;
		}
	}
}

1.gif


使用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);
}