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
參考項目
參考課件