Unity3D课程学习笔记(五)

这篇博客介绍了Unity3D游戏中如何实现动作与物理的分离,通过创建CCPhysicsActionManager和IActionManager接口,允许选择运动学或物理学方式创建飞碟。适配器模式被用于设计UML图,代码中新增了延迟执行Start方法以根据按钮选择模式。同时,飞碟的物理特性通过添加刚体属性在FixedUpdate中处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打飞碟游戏改进版----动作与物理分离版

本次作业主要是要添加一个管理物理动作的动作管理器CCPhysicsActionManager,并且通过添加按钮来决定选择哪一种创造飞碟的方式。因此在游戏的初始阶段有2中选择,一种是飞碟的运动将以运动的方式形成,另外一种是飞碟会以物理的方式形成,采用适配器模式,因此需要新建一个公共接口IActionManager,用来确定游戏开始的时候选择哪一种动作管理器。

游戏的初始接口效果图如下所示:

适配器模式的UML图的设计如下所示:

接下来是各个相关类修改后的方法,及其代码,因为代码和之前的设计有很多相似的地方,所以这里只分析修改过和新添加的代码,不做重复,相关可以参考上一次的作业:Unity3D课程学习笔记(四)

下面是一个公共的接口IActionManager,是CCActionManager和CCPhysicsActionManager需要实现的,在场景控制器中通过定义IActionManager和选择相应的按钮,可以选择使用运动学方式还是物理学方式:

public interface IActionManager
{
    int getDiskNumber();
    void setDiskNumber(int _diskNumber);
    void StartThrow(Queue<GameObject> diskQueue);
}

然后是CCActionManager的代码,基本上跟上次的没有什么改变,但是在这个类的代码里面添加了一个延迟执行Start的方法,因为我需要在开始的时候通过按钮来选择相应的模式,但是又不能在Update中时刻检测这个状态码的改变,所以只好采用这种方式,具体的代码如下所示:

public class CCActionManager : SSActionManager, ISSActionCallback, IActionManager
{
    public FirstSceneController sceneController;
    public List<CCFlyAction> Fly;
    private int DiskNumber = 0;
    //private bool isFirstEnter = true;

    private List<SSAction> Used = new List<SSAction>();
    private List<SSAction> Free = new List<SSAction>();

    public void setDiskNumber(int _diskNumber)
    {
        DiskNumber = _diskNumber;
    }

    public int getDiskNumber()
    {
        return DiskNumber;
    }

    //GetSSAction,首先从工厂里面找,如果没有的话就创造
    SSAction GetSSAction()
    {
        SSAction action = null;
        if (Free.Count > 0)
        {
            action = Free[0];
            Free.Remove(Free[0]);
        }
        else
        {
            action = ScriptableObject.Instantiate<CCFlyAction>(Fly[0]);
        }

        Used.Add(action);
        return action;
    }

    //FreeSSAction
    public void FreeSSAction(SSAction action)
    {
        SSAction temp = null;
        foreach (SSAction disk in Used)
        {
            if (action.GetInstanceID() == disk.GetInstanceID())
            {
                temp = disk;
            }
        }
        if (temp != null)
        {
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值