前言
这次的任务是实现物理学运动,结果我发现在上次作业中我全给实现了。
所以这次只要简单实现adapter就行了。
一、任务要求
二、 项目展示
我的adapter是实现物理学跟运动学两种运动的接口。
1.原版运动
public void setdisk(int sp,System.Random r){//改变飞碟速度
int rp = r.Next()%position.GetLength(0);
disk.transform.position = position[rp];
Rigidbody rigidbody;
rigidbody = disk.GetComponent<Rigidbody>();
//启动刚体
rigidbody.WakeUp();
rigidbody.useGravity = true;
//添加瞬间力
float disksp = 1;
for(int i = 1;i<sp;i++)disksp *= 1.1f;
rigidbody.AddForce(force[rp]*Random.Range(5, 8)*disksp/5, ForceMode.Impulse);
//添加旋转力
rigidbody.AddTorque(rota[rp] * 10);
}
2.使用adapter
public void setdisk(int sp,System.Random r){//改变飞碟速度
int rp = r.Next()%position.GetLength(0);
disk.transform.position = position[rp];
Rigidbody rigidbody;
rigidbody = disk.GetComponent<Rigidbody>();
//启动刚体
rigidbody.WakeUp();
float disksp = 1;
for(int i = 1;i<sp;i++)disksp *= 1.1f;
Vector3 f = force[rp]*disksp;
adapter.move(2,f,rota[rp]);
}
adapter类
public class Adapter: System.Object{
public Kinematicsn kinematicsn;
public Physis physis;
GameObject disk;
public Adapter(GameObject disk){
this.disk = disk;
kinematicsn = disk.AddComponent<Kinematicsn>() as Kinematicsn;
physis = disk.AddComponent<Physis>() as Physis;
kinematicsn.setdisk(disk);
physis.setdisk(disk);
}
public void move(int mode,Vector3 force,Vector3 rota){
if(mode == 1){
physis.move(force,rota);
}
else kinematicsn.move(force);
}
public void stop(){
kinematicsn.stop();
}
}
物理学类
public class Physis:MonoBehaviour{
GameObject disk;
public void setdisk(GameObject disk){
this.disk = disk;
}
public void move(Vector3 force,Vector3 rota){
Rigidbody rigidbody;
rigidbody = disk.GetComponent<Rigidbody>();
rigidbody.useGravity = true;
//添加瞬间力
rigidbody.AddForce(force*Random.Range(5, 8)/5, ForceMode.Impulse);
//添加旋转力
rigidbody.AddTorque(rota * 10);
}
}
运动学类
public class Kinematicsn:MonoBehaviour{
GameObject disk;
Vector3 speed;
float gra = -10.0f;
int work = 0;
public void setdisk(GameObject disk){
this.disk = disk;
}
public void move(Vector3 force){
speed = force;
work = 1;
}
public void stop(){
work = 0;
}
void Update(){
if(work == 1){
disk.transform.position += speed*Time.deltaTime;
speed.y += gra*Time.deltaTime;
}
}
}