3D游戏:第6次作业
学号:20331013
改进飞碟(HitUFO)游戏
1 游戏内容要求:
- 按 adapter 模式设计图修改飞碟游戏
- 使它同时支持物理运动与运动学(变换)运动
2 项目地址及演示视频
-
项目地址:https://gitee.com/sse_20331013/3d-game/tree/master/%E4%BD%9C%E4%B8%9A%E5%85%AD%EF%BC%9AHitUFO%EF%BC%88%E7%89%A9%E7%90%86%E7%89%88%EF%BC%89
-
演示视频(用动图代替:和上次作业差不多)
3 实现
3.1 adapter模式
- 新增物理运动适配器 类
PhysisActionManager
和 运动学适配器ActionManager
实现接口IActionManager
- 类
ActionManager
采用adapter模式 - 刚体组件
Rigidbody
3.3 类的改进
CCMoveToAction.cs
public override void Update()
{
this.gamebject.GetComPonent<Rigidbody>().AddForce(Vector3.Normalize(target - this.transform.position) * speed/100, ForceMode.Impulse);
if (this.transform.position.z <= target.z || (target.y <= -100 && this.transform.position.y < -100))
{
// waiting for destory
this.destory = true;
this.callback.SSActionEvent(this);
this.gamebject.GetComPonent<Rigidbody>().isKinematic = true;
this.gamebject.GetComPonent<Rigidbody>().isKinematic = false;
}
}
FirstController.cs
- 修改
Update
方法
// Update is called once per frame
void Update()
{
int UFOsceneNUm = 0; // 模式
UnityEngine.Debug.Log(UFOsceneNUm);
for (int i = 0; i < goList_usedAndFree.Count; ++i)
{
if(goList_usedAndFree[i]==0 && UFOsceneNUm<((int)SSDirector.getInstance().GetCreditCount()/1000 + 5))
{
SSDirector.getInstance().ccam.UFOToDestination(i);
goList_usedAndFree[i] = 1;
UFOsceneNUm += 1;
}
else if (goList_usedAndFree[i] == 0)
UFOsceneNUm += 1;
}
UFOController.cs
- 碰撞函数
void OnCollisionExit(Collision collision)
{
if (collision.relativeVelocity.magnitude > 100)
{
if(SSDirector. getInstance().firstcontroller.golist_usedAndFree[SSDirector.getlnstance().firstcontroller.getbamebjectlndex(collision.transform. position)])
{
SSDirector ssdDirector = SSDirector.getInstance();
// 计算得按距离相机位置算分数的,如果是飞碟跌落撞下的飞碟,则算分数的1.5倍
// (因为掉落飞机和被碰飞机都会触发这个函数,所以传递分数时要传递愤俗*0.75)
// UFO圆盘的中心位置与飞碟的中心位置相同原因 (当用了刚体rigid bodv后,hit.transform.parent.gamebject;失效了,会报错
int credit = (int)Vector3.Distance(collision.transform.position, new Vector3(0, 1, 0));
ssdDirector.AddCreditCount((int)((double) credit * 0.75));
ssdDirector.ccam.UFODrop(ssdDirector.firstcontroller.getGame0bjectIndex(collision.transform.position));
}
}
UnityEngine.Debug.Log("发生碰撞结束");
}