上次我们做了一个打飞碟的游戏,当时的打飞碟是运动学的模式,即并没有像现实生活中的一样受到重力,摩擦力等因素的影响。这次我们将为我们的打飞碟游戏添加物理运动,即让我们的飞碟受到物理因素的影响,
为了能重用我们上次的打飞碟的代码,我们这次使用Adpater的模式适配器模式
代码
这周的代码和上周的代码,大致一样,只不过是为了使用适配器模式,加了一个IActionMananager的结构
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface IActionManager {
int getDiskNum();
void StartThrow(Queue<GameObject> disks);
void setDiskNum(int num);
}
还有CCPhysicsManager.cs, 重写了SSActionManger一些方法
using Com.Action;
using Com.MyGame;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CCPhysicsManager : SSActionManager, ISSActionCallback, IActionManager
{
public int diskNum;
public FirstController scene;
float speed = 20f;
CCFlyActionFactory flyActionFactory;
void ISSActionCallback.SSActionEvent(SSAction source, SSActionEventType events, int intParam, string strParam, Object objectParam)
{
if (source is CCFlyAction)
{
diskNum--;
DiskFactory df = Singleton<DiskFactory>.Instance;
df.FreeDisk(source.gameObject);
flyActionFactory.FreeAction((CCFlyAction)source);
}
}
void Start()
{
scene = Director.getInstance().currentSceneController as FirstController;
scene.actionManger = this;
flyActionFactory = Singleton<CCFlyActionFactory>.Instance;
}
//重写一下SSActionManager的方法, 让其执行Action的FixedUpdate方法
protected void Update()
{
foreach (SSAction ac in waitingAdd)
{
actions[ac.GetInstanceID()] = ac;
}
waitingAdd.Clear();
foreach (KeyValuePair<int, SSAction> kv in actions)
{
SSAction ac = kv.Value;
if (ac.distroy)
{
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();
}
public void RunAction(GameObject gameobject, SSAction action, ISSActionCallback manager)
{
action.gameObject = gameobject;
if(!action.gameObject.GetComponent<Rigidbody>())
action.gameObject.AddComponent<Rigidbody>();
action.transform = gameobject.transform;
action.callback = manager;
waitingAdd.Add(action);
action.Start();
}
public void StartThrow(Queue<GameObject> disks)
{
foreach (GameObject disk in disks)
{
RunAction(disk, flyActionFactory.GetAction(), (ISSActionCallback)this);
}
}
public int getDiskNum()
{
return diskNum;
}
public void setDiskNum(int num)
{
diskNum = num;
}
}
对UserGUI进行一些修改
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Com.MyGame;
public class UserGUI : MonoBehaviour
{
public FirstController scene;
public int status = 0;
public bool isFirst = true;
GUIStyle style;
GUIStyle buttonStyle;
float time = 60;
float second = 0;
bool isSelect = false;
void Start()
{
//scene = Director.getInstance().currentSceneController as FirstController;
scene = Director.getInstance().currentSceneController as FirstController;
style = new GUIStyle();
style.fontSize = 40;
style.normal.textColor = Color.red;
style.alignment = TextAnchor.MiddleCenter;
buttonStyle = new GUIStyle("button");
buttonStyle.fontSize = 25;
}
private void Update()
{
//scene.click();
}
void OnGUI() {
int buttonX = Screen.width / 2 - 45;
int buttonY = Screen.height / 2 - 45;
int labelX = Screen.width / 2 - 45;
int labelY = Screen.height;
if (scene.GetRound() == 2 && scene.actionManger.getDiskNum() == 0)
{
//Debug.Log(2);
GUI.Button(new Rect(buttonX, buttonY, 90, 90), "GameOver");
return;
}
if (!isSelect)
{
if (GUI.Button(new Rect(buttonX- 45, buttonY, 90, 90), "PHYSICS"))
{
scene.setMode(1);
isSelect = true;
}
if (GUI.Button(new Rect(buttonX + 90, buttonY, 90, 90), "CCFLY")) {
scene.setMode(0);
isSelect = true;
}
return;
}
scene.hit();
//GUI.Label(new Rect(buttonX, buttonY, 90, 90), "GameOver");
GUI.Label(new Rect(1000, 0, 400, 400), scene.getScore().ToString(),style);
if (scene.GetGameState() == GameState.RUNNING && GUI.Button(new Rect(10, 10,90,90 ), "Pause",buttonStyle) )
{
scene.SetGameState(GameState.PAUSE);
Time.timeScale = 0;
}
if (scene.GetGameState() == GameState.PAUSE && GUI.Button(new Rect(10, 10, 90,90), "Run", buttonStyle))
{
scene.SetGameState(GameState.RUNNING);
Time.timeScale = 1;
}
if (scene.GetRound() == -1 && GUI.Button(new Rect(buttonX, buttonY, 90, 90), "Start")) {
scene.SetGameState(GameState.ROUND_START);
}
if (scene.GetGameState() == GameState.ROUND_FINISH && scene.GetRound() < 2 && GUI.Button(new Rect(buttonX, buttonY, 90, 90), "Next Round"))
{
scene.SetGameState(GameState.ROUND_START);
}
}
}