static float Ripple(float x,float z,float t){
float d = Mathf.Sqrt (x * x + z * z);//计算距离,波动影响因子
float f = Mathf.Sin(Mathf.PI *(4 * d - t));//4为波段,π为1个波段
f /= 1 + 10* d;//减小振幅,d越小,振幅越大,也就是中心振幅大
return f;
}
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);
}