3D游戏编程与设计第五次作业

作业内容

1.改进飞碟(Hit UFO)游戏:

  • 游戏内容要求:
    1.按 adapter模式 设计图修改飞碟游戏
    2.使它同时支持物理运动与运动学(变换)运动

适配器模式:将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。

新增加的文件有三个
1.适配器:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Adapter : MonoBehaviour, MyActionManager
{
    public FlyActionManager flyManager;
    public PhysicalActionManager physicalManager;
    public void playDisk(GameObject disk, float angle, float power, bool isPhysical)
    {
        if (isPhysical)
        {
            physicalManager.UFOFly(disk, angle, power);
        }
        else
        {
            flyManager.UFOFly(disk, angle, power);
        }
    }
    // Use this for initialization
    void Start()
    {
        flyManager = gameObject.AddComponent<FlyActionManager>() as FlyActionManager;
        physicalManager = gameObject.AddComponent<PhysicalActionManager>() as PhysicalActionManager;
    }

}

主要是根据传进来的参数isPhysical来判断是调用运动学的函数还是动力学的函数。

2.动力学管理器:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PhysicalActionManager : SSActionManager
{
    public PhysicalUFOAction fly;                            //飞碟飞行的动作
    protected void Start()
    {
    }
    //飞碟飞行
    public void UFOFly(GameObject UFO, float angle, float power)
    {
        fly = PhysicalUFOAction.GetSSAction(UFO.GetComponent<DiskData>().direction, angle, power);
        this.RunAction(UFO, fly, this);
    }
}

3.动力学飞行动作:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PhysicalUFOAction : SSAction
{
    private Vector3 start_vector;                              //初速度向量
    public float power;
    // Start is called before the first frame update
    public override void Start()
    {
        gameobject.GetComponent<Rigidbody>().velocity = power / 35 * start_vector;
        gameobject.GetComponent<Rigidbody>().useGravity = true;
    }

    // Update is called once per frame
    public override void Update()
    {
        
    }

    public override void FixedUpdate()
    {

        //判断是否超出范围
        if (this.transform.position.y < -10)
        {
            this.destroy = true;
            this.callback.SSActionEvent(this);
        }
    }

    public static PhysicalUFOAction GetSSAction(Vector3 direction, float angle, float power)
    {
        //初始化物体将要运动的初速度向量
        PhysicalUFOAction action = CreateInstance<PhysicalUFOAction>();
        if (direction.x == -1)
        {
            action.start_vector = Quaternion.Euler(new Vector3(0, 0, -angle)) * Vector3.left * power;
        }
        else
        {
            action.start_vector = Quaternion.Euler(new Vector3(0, 0, angle)) * Vector3.right * power;
        }
        action.power = power * 2.5f;
        return action;
    }
}

这里值得注意的是,动力学的动作,最好是调用FixedUpdate函数,此函数调用的时间间隔是固定的,而Update函数是在每一帧调用,但是不同设备每一帧的间隔时间不一样,所以处理刚体的时候最好是用此函数。

出于多了一个动力学的动作,所以在SSActionManager文件中,新增加一个FixedUpdate函数:

protected void FixedUpdate()
    {
        foreach (SSAction ac in waitingAdd)
        {
            actions[ac.GetInstanceID()] = ac;
        }
        waitingAdd.Clear();

        foreach (KeyValuePair<int, SSAction> kv in actions)
        {
            SSAction ac = kv.Value;
            if (ac.destroy)
            {
                waitingDelete.Add(ac.GetInstanceID());
            }
            else if (ac.enable)
            {
                ac.FixedUpdate();
            }
        }
        foreach (int key in waitingDelete)
        {
            SSAction ac = actions[key];
            actions.Remove(key);
            DestroyObject(ac);
        }
        waitingDelete.Clear();
    }

代码基本与Update函数是一样的,唯一不同的是这里调用的是ac.FixedUpdate(),而Update函数调用的是ac.Update()

新增加的接口函数:

public interface MyActionManager
{
    void playDisk(GameObject UFO, float angle, float power, bool isPhysical);
}

这个类是在FirstController中实例化action_manager中用到。

然后为了能让飞碟使用动力学的函数调用,因此需要给每种飞碟添加Rigidbody的属性。首先点击预制,然后点击Open Prefab
在这里插入图片描述
然后在Inspector中找到Add Component->Physics->Rigidbody
在这里插入图片描述
在这里插入图片描述

在运行游戏前,可以点击Main Camera选择是否用动力学的方法运行:
在这里插入图片描述

在录制视频过程中发现两两架飞碟会发生碰撞,为此我们还得给飞碟预制添加Box Collider属性,并把Is Trigger属性去掉勾选:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

项目传送门
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值