3D游戏第6次作业

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("发生碰撞结束");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值