Unity3d作業(六):改進飛碟(Hit UFO)遊戲

Unity3d作業(六)

本次作業的內容爲:改進飛碟(Hit UFO)遊戲

遊戲內容要求:
1、按 adapter模式 設計圖修改飛碟遊戲
2、使它同時支持物理運動與運動學(變換)運動

1、按 adapter模式 設計圖修改飛碟遊戲
我們首先需要知道和了解Adapter模式:
Adapter模式分爲兩種:
1.類適配器模式
2.委託適配器
我們這裏更多使用的是類適配器模式。
適配器模式(Adapter)包含以下主要角色。
目標(Target)接口:當前系統業務所期待的接口,它可以是抽象類或接口。
適配者(Adaptee)類:它是被訪問和適配的現存組件庫中的組件接口。
適配器(Adapter)類:它是一個轉換器,通過繼承或引用適配者的對象,把適配者接口轉換成目標接口,讓客戶按目標接口的格式訪問適配者。
我們如果要在原來的基礎上實現物理效果,必須明確誰是適配器誰是適配者。我們過去已經將飛碟遊戲的運動功能放在了CCActionManager.cs上,所以這裏是非物理學運動,我們要進行添加。在不刪除原有的非物理學變換運動動作管理器,可以通過適配器模式來實現。
關於本次遊戲的改動具體如圖所示:

在這裏插入圖片描述
在原有代碼的基礎上增加一個PhysisActionManager動作管理器類,

public class PhysicsActionManager : SSActionManager, ISSActionCallback, IActionManager {
    public FirstSceneController sceneController;
    public List<PhysicsEmitAction> seq = new List<PhysicsEmitAction>();
    public UserClickAction userClickAction;
    public DiskFactory disks;

    protected void Start()
    {
        sceneController = (FirstSceneController)SSDirector.getInstance().currentSceneController;
        sceneController.actionManager = this;
        disks = Singleton<DiskFactory>.Instance;
    }
    public void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Completed, int intParam = 0, string strParam = null, Object objParam = null)
    {
        ....
    }
    public void CheckEvent(SSAction source, SSActionEventType events = SSActionEventType.Completed, int intParam = 0, string strParam = null, Object objParam = null)
    {
    }
    public void Pause()
    {
       .......
    }
    public void PlayDisk()
    {
    ......
    }
}

這裏使用了動作類爲PhysisActionMove動作類。
同時將剛體Rigidbody組件爲遊戲對象提供物理屬性,讓遊戲對象在場景中可以受到物理引擎的作用。當遊戲對象添加了Rigidbody組件後,便使物體具有了相應的物理力。

同時這裏我們使用IActionManger作爲接口:

public interface IActionManager {
    void PlayDisk();
    void Pause();
}

CCActionManager修改Update函數爲PlayDisk函數。只需要修改名字即可,其餘不變。
FirstSceneController函數修改三個地方:

FirstSceneController:
//public CCActionManager actionManager修改爲:
public IActionManager actionManager;
this.gameObject.AddComponent<CCActionManager>()修改爲:
this.gameObject.AddComponent<PhysicsActionManager>();
public void Update()
{
    if (times < 30 && flag == 0)
    {
        if (interval <= 0)
        {
            interval = Random.Range(3, 5);
            times++;
            df.GenDisk();
        }
        interval -= Time.deltaTime;
    }
    //ADD
    actionManager.PlayDisk();
}

接下來實現PhysicsEmitAction:

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

public class PhysicsEmitAction : SSAction {
    public Vector3 speed;

    public static PhysicsEmitAction GetSSAction()
    {
        PhysicsEmitAction action = CreateInstance<PhysicsEmitAction>();
        return action;
    }
    public override void Start()
    {
    }
    public override void Update()
    {
        if (transform.position.y < -10 || transform.position.x <= -20 || transform.position.x >= 20)
        {
            gameObject.GetComponent<Rigidbody>().isKinematic = true;
            gameObject.GetComponent<Rigidbody>().velocity = Vector3.zero;
            transform.position = Vector3.down;
            callback.SSActionEvent(this);
        }
    }
}

這裏PhysicsEmitAction實現了對飛碟物理屬性,例如速度等的控制。
具體實現請移步github。
項目地址
參考資料:
pmlpml的github
參考項目
參考課件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章