Assignment 6

本文介绍了一款使用Unity开发的飞碟游戏,并详细记录了如何通过引入物理引擎改进游戏,实现支持物理运动与变换运动。作者展示了关键代码片段,包括如何调整Update方法为FixedUpdate,以及如何在游戏对象上应用物理引擎。
摘要由CSDN通过智能技术生成

本次作业是二选一作业,我挑选的是改进飞碟作业一项。

1、改进飞碟(HitUFO) 游戏: 

        1.按adapter模式设计图修改飞碟游戏

        2.使它同时支持物理运动与运动学(变换)运动

源代码:https://github.com/ShirohaBili/UnityGame/tree/master

演示视频:打飞碟小游戏 物理引擎版

实际上,本次代码和上次写的可以说十分相似,仅仅只是添加物理引擎的调用即可。因此我不会将上次有过的代码再发,仅列出主要变动的代码如下:

DiskFlyAction

    public override void Update() {
        //计算物体的向下的速度,v=at
        // time += Time.fixedDeltaTime;
        // gravity_vector.y = gravity * time * 0.1f;

        // //位移模拟
        // transform.position += (start_vector + gravity_vector) * Time.fixedDeltaTime;
        // current_angle.z = Mathf.Atan((start_vector.y + gravity_vector.y) / start_vector.x) * Mathf.Rad2Deg;
        // transform.eulerAngles = current_angle;

        // if (this.transform.position.y < -10) {
        //     this.destroy = true;
        //     this.callback.SSActionEvent(this);      
        // }
    }

    private void FixedUpdate() {
        if (this.transform.position.y < -10) {
            gameobject.GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 0);
            // gameobject.GetComponent<Rigidbody>().angularVelocity = new Vector3(0, 0, 0);
            // gameobject.GetComponent<Rigidbody>().speed.X = new Vector3(0, 0, 0);
            this.destroy = true;
            this.callback.SSActionEvent(this);
        }
    }

上面的Update为前一次作业的写法,此处列出主要是为了更明显地作对比。本次作业因为要引用物理引擎,所以需要用FixedUpdate()来更新动作,可见,在物理引擎的作用下,无需我们自己写运动方法,仅需列出我们需要它更新的动作。

FlyActionManger

    public void DiskFly(GameObject disk, float power) {
        disk.GetComponent<Rigidbody>().isKinematic = false;
        int lor = 1;
        if (disk.transform.position.x > 0) lor = -1;
        fly = DiskFlyAction.GetSSAction(lor, power);
        this.RunAction(disk, fly, this);
    }

这里的DiskFly和之前的不一样,输入Power,利用物理引擎自动计算。

Controller和SSActionManger

更改或加入一下调用即可。

//Controller
action_manager.DiskFly(curDisk, power * 3);    //更新一下前面更改的DiskFly的调用

//SSActionManager
ac.FixedUpdate(); //在SSActionManager中加入物理引擎的调用

其他更改

  1. 之前使用运动学变换运动时,因为方便回收和设置速度,所以直接回收不会有问题,但利用物理引擎时,直接更改速度似乎会出问题,回收时飞盘没法更改速度,因此我将它的角阻力加到了1k,并在飞盘下面加上了一个平台接着它们,防止速度过快(不加飞盘会一直自由落体,速度会非常快)
  2. 在一些影响不大的类中加入了支持FixedUpdate的方法,有点杂,就不列出来了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值