code
Basecode.cs
using UnityEngine;
using System.Collections;
using Com.Mygame;
namespace Com.Mygame {
public enum WinOrLose {Win,Lose,Gaming};
public interface ImyAction {
void DevilGoOnBoat();
void DevilGoOffBoat ();
void PriestGoOnBoat();
void PriestGoOffBoat();
void BoatGo ();
bool IQueryGameStatus ();
}
public class GameSceneController:System.Object, ImyAction {
private static GameSceneController _instance;
private BaseCode _base_code;
private GenGameObjects _gen_game_object;
public WinOrLose wl = WinOrLose.Gaming;
public static GameSceneController GetInstance(){
if (null == _instance) {
_instance = new GameSceneController ();
}
return _instance;
}
public BaseCode getBaseCode(){
return _base_code;
}
internal void setBaseCode(BaseCode bc){
if (null == _base_code) {
_base_code = bc;
}
}
public GenGameObjects getGenGameObject(){
return _gen_game_object;
}
internal void setGenGameObject(GenGameObjects g){
if (_gen_game_object == null){
_gen_game_object = g;
}
}
public void DevilGoOnBoat(){
_gen_game_object.DevilGoOnBoat ();
}
public void DevilGoOffBoat (){
_gen_game_object.DevilGoOffBoat ();
}
public void PriestGoOnBoat(){
_gen_game_object.PriestGoOnBoat ();
}
public void PriestGoOffBoat(){
_gen_game_object.PriestGoOffBoat ();
}
public void BoatGo (){
_gen_game_object.BoatGo ();
}
public bool IQueryGameStatus (){
return _gen_game_object.IQueryGameStatus ();
}
}
public class ActionManager :System.Object {
private static ActionManager _instance;
public static ActionManager GetInstance(){
if (_instance == null) {
_instance = new ActionManager();
}
return _instance;
}
public U3dAction ApplyMoveGameObjectTo(GameObject obj,Vector3 target,int speed,IU3dActionCompleted com) {
MoveGameObjectTo ac = obj.AddComponent<MoveGameObjectTo> ();
ac.setting (obj,target,speed,com);
return ac;
}
public U3dAction ApplyMoveToLocal(GameObject obj,Vector3 targetlocal,int speed,IU3dActionCompleted com){
MoveToLocalPosition ac = obj.AddComponent<MoveToLocalPosition> ();
ac.setting (obj,targetlocal,speed,com);
return ac;
}
}
public class U3dActionException : System.Exception {}
public interface IU3dActionCompleted {
void OnActionCompleted (U3dAction action);
}
public class U3dAction : MonoBehaviour {
public void Free(){}
}
public class U3dActionman : U3dAction {}
public class MoveGameObjectTo : U3dActionman {
public GameObject obj;
public Vector3 target;
public int speed;
private IU3dActionCompleted monitor = null;
public void setting(GameObject obj,Vector3 target,int speed,IU3dActionCompleted monitor){
this.obj = obj;
this.target = target;
this.speed = speed;
this.monitor = monitor;
}
void Update(){
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards (transform.position,target,step);
if(transform.position == target){
if (monitor != null) {
monitor.OnActionCompleted (this);
}
Destroy (this);
}
}
}
public class MoveToLocalPosition : U3dActionman {
public GameObject obj;
public Vector3 targetlocal;
public int speed;
private IU3dActionCompleted monitor = null;
public void setting(GameObject obj,Vector3 targetlocal,int speed,IU3dActionCompleted monitor){
this.obj = obj;
this.targetlocal = targetlocal;
this.speed = speed;
this.monitor = monitor;
}
void Update(){
float step = speed * Time.deltaTime;
transform.localPosition = Vector3.MoveTowards (transform.localPosition,targetlocal,step);
if(transform.localPosition == targetlocal){
if(monitor != null){
monitor.OnActionCompleted (this);
}
Destroy (this);
}
}
}
}
public class BaseCode : MonoBehaviour {
public string gameName;
public string gameRule;
void Start () {
this.transform.position = new Vector3 (0.0f,5.0f,-12.0f);
GameSceneController mygame = GameSceneController.GetInstance ();
mygame.setBaseCode (this);
}
void Update () {
}
}
GenGameObject.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Com.Mygame;
public class GenGameObjects : MonoBehaviour , IU3dActionCompleted{
GameSceneController mygame;
public int moving = 0;
int state = 0;
GameObject Boat;
Vector3 boatscale = new Vector3(4.0f,0.3f,2.0f);
Vector3 boatStartpos = new Vector3(-6.0f,0.0f,0.0f);
Vector3 boatEndpos = new Vector3(6.0f,0.0f,0.0f);
Vector3 boatsit1 = new Vector3 (-0.25f,3.45f,0.0f);
Vector3 boatsit2 = new Vector3 (0.25f,3.45f,0.0f);
int boatspeed = 4;
int boatnumber = 0;
int Ifboatsit1have = 0;
int Ifboatsit2have = 0;
List<GameObject> devils = new List<GameObject>();
Vector3[] devilStartpos = new Vector3[3]{
new Vector3(-10f,1.15f,-3f),
new Vector3(-10f,1.15f,-2f),
new Vector3(-10f,1.15f,-1f)
};
Vector3[] devilEndpos = new Vector3[3]{
new Vector3(10f,1.15f,-3f),
new Vector3(10f,1.15f,-2f),
new Vector3(10f,1.15f,-1f)
};
Vector3[] devilScale = new Vector3[3]{
new Vector3(),
new Vector3(),
new Vector3()
};
int[] DevilsState = new int[3]{0,0,0};
int[] Devilssite = new int[3]{0,0,0};
int devilStartside = 3;
int devilEndside = 0;
List<GameObject> priests = new List<GameObject>();
Vector3[] priestStartpos = new Vector3[3]{
new Vector3(-10f,1.15f,1f),
new Vector3(-10f,1.15f,2f),
new Vector3(-10f,1.15f,3f)
};
Vector3[] prisetEndpos = new Vector3[3]{
new Vector3(10f,1.15f,1f),
new Vector3(10f,1.15f,2f),
new Vector3(10f,1.15f,3f)
};
Vector3[] priestScale = new Vector3[3]{
new Vector3(),
new Vector3(),
new Vector3()
};
int[] PriestState = new int[3]{0,0,0};
int[] Priestsite = new int[3]{0,0,0};
int priestStartside = 3;
int priestEndside = 0;
GameObject startside;
Vector3 startsidepos = new Vector3 (-10.0f,0.0f,0.0f);
Vector3 startsidescale = new Vector3(4f,0.3f,8f);
GameObject endside;
Vector3 endsidepos = new Vector3 (10.0f,0.0f,0.0f);
Vector3 endsidescale = new Vector3(4f,0.3f,8f);
void Start () {
mygame = GameSceneController.GetInstance ();
mygame.setGenGameObject (this);
InsAll ();
}
void Update () {
float step = boatspeed * Time.deltaTime;
if(state == 2){
if(Boat.transform.position == boatEndpos) state = 1;
} else if (state == 3){
if(Boat.transform.position == boatStartpos) state = 0;
}
}
void InsAll(){
startside = GameObject.CreatePrimitive(PrimitiveType.Cube);
startside.transform.localScale = startsidescale;
startside.transform.position = startsidepos;
startside.GetComponent<Renderer> ().material.color = Color.green;
endside = GameObject.CreatePrimitive (PrimitiveType.Cube);
endside.transform.localScale = endsidescale;
endside.transform.position = endsidepos;
endside.GetComponent<Renderer> ().material.color = Color.green;
Boat = GameObject.CreatePrimitive(PrimitiveType.Cube);
Boat.transform.position = boatStartpos;
Boat.transform.localScale = boatscale;
Boat.GetComponent<Renderer> ().material.color = Color.grey;
for(int i = 0;i<3;i++){
GameObject devil = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
devil.GetComponent<Renderer> ().material.color = Color.red;
devil.transform.position = devilStartpos [i];
devils.Add (devil);
GameObject priest = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
priest.transform.position = priestStartpos [i];
priests.Add (priest);
}
GameObject light = new GameObject("The light");
Light lightComp = light.AddComponent<Light> ();
lightComp.type = LightType.Directional;
light.transform.position = new Vector3 ();
Quaternion Q;
Q = Quaternion.Euler (20.0f,0.0f,0.0f);
light.transform.rotation = Q;
}
public void DevilGoOnBoat(){
if (!IQueryGameStatus ())
return;
if (state == 0) {
if (boatnumber != 2) {
for (int i = 0; i < 3; i++) {
if (DevilsState [i] == 0) {
DevilsState [i] = 2;
devils [i].transform.parent = Boat.transform;
if (Ifboatsit1have == 0 && Ifboatsit2have == 0) {
ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit1,4,this);
Devilssite [i] = 1;
Ifboatsit1have = 1;
} else if (Ifboatsit1have == 1 && Ifboatsit2have == 0) {
ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit2,4,this);
Devilssite [i] = 2;
Ifboatsit2have = 1;
} else if (Ifboatsit1have == 0 && Ifboatsit2have == 1) {
ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit1,4,this);
Devilssite [i] = 1;
Ifboatsit1have = 1;
}
devilStartside--;
boatnumber++;
break;
}
}
}
} else if (state == 1) {
if (boatnumber != 2) {
for (int i = 0; i < 3; i++) {
if (DevilsState [i] == 1) {
DevilsState [i] = 2;
devils [i].transform.parent = Boat.transform;
if (Ifboatsit1have == 0 && Ifboatsit2have == 0) {
ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit1,4,this);
Devilssite [i] = 1;
Ifboatsit1have = 1;
} else if (Ifboatsit1have == 1 && Ifboatsit2have == 0) {
ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit2,4,this);
Devilssite [i] = 2;
Ifboatsit2have = 1;
} else if (Ifboatsit1have == 0 && Ifboatsit2have == 1) {
ActionManager.GetInstance ().ApplyMoveToLocal (devils[i],boatsit1,4,this);
Devilssite [i] = 1;
Ifboatsit1have = 1;
}
devilEndside--;
boatnumber++;
break;
}
}
}
}
}
public void DevilGoOffBoat(){
if (!IQueryGameStatus ())
return;
if (state == 0) {
for (int i = 0; i < 3; i++) {
if(DevilsState[i] == 2){
devils [i].transform.parent = null;
ActionManager.GetInstance ().ApplyMoveGameObjectTo (devils[i],devilStartpos[i],6,this);
DevilsState[i] = 0;
if (Devilssite [i] == 1)
Ifboatsit1have = 0;
else if (Devilssite [i] == 2)
Ifboatsit2have = 0;
Devilssite [i] = 0;
devilStartside++;
boatnumber--;
break;
}
}
} else if (state == 1) {
for (int i = 0; i < 3; i++) {
if(DevilsState[i] == 2){
devils [i].transform.parent = null;
ActionManager.GetInstance ().ApplyMoveGameObjectTo (devils[i],devilEndpos[i],6,this);
DevilsState[i] = 1;
if (Devilssite [i] == 1)
Ifboatsit1have = 0;
else if (Devilssite [i] == 2)
Ifboatsit2have = 0;
Devilssite [i] = 0;
devilEndside++;
boatnumber--;
break;
}
}
}
}
public void PriestGoOnBoat(){
if (!IQueryGameStatus ())
return;
if (state == 0) {
if (boatnumber != 2) {
for (int i = 0; i < 3; i++) {
if (PriestState [i] == 0) {
PriestState [i] = 2;
priests [i].transform.parent = Boat.transform;
if (Ifboatsit1have == 0 && Ifboatsit2have == 0) {
ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit1,4,this);
Priestsite [i] = 1;
Ifboatsit1have = 1;
} else if (Ifboatsit1have == 1 && Ifboatsit2have == 0) {
ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit2,4,this);
Priestsite [i] = 2;
Ifboatsit2have = 1;
} else if (Ifboatsit1have == 0 && Ifboatsit2have == 1) {
ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit1,4,this);
Priestsite [i] = 1;
Ifboatsit1have = 1;
}
priestStartside--;
boatnumber++;
break;
}
}
}
} else if (state == 1) {
if (boatnumber != 2) {
for (int i = 0; i < 3; i++) {
if (PriestState [i] == 1) {
PriestState [i] = 2;
priests [i].transform.parent = Boat.transform;
if (Ifboatsit1have == 0 && Ifboatsit2have == 0) {
ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit1,4,this);
Priestsite [i] = 1;
Ifboatsit1have = 1;
} else if (Ifboatsit1have == 1 && Ifboatsit2have == 0) {
ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit2,4,this);
Priestsite [i] = 2;
Ifboatsit2have = 1;
} else if (Ifboatsit1have == 0 && Ifboatsit2have == 1) {
ActionManager.GetInstance ().ApplyMoveToLocal (priests[i],boatsit1,4,this);
Priestsite [i] = 1;
Ifboatsit1have = 1;
}
priestEndside--;
boatnumber++;
break;
}
}
}
}
}
public void PriestGoOffBoat(){
if (!IQueryGameStatus ())
return;
if (state == 0) {
for (int i = 0; i < 3; i++) {
if(PriestState[i] == 2){
priests [i].transform.parent = null;
ActionManager.GetInstance ().ApplyMoveGameObjectTo (priests[i],priestStartpos[i],6,this);
PriestState[i] = 0;
if (Priestsite [i] == 1)
Ifboatsit1have = 0;
else if (Priestsite [i] == 2)
Ifboatsit2have = 0;
Priestsite [i] = 0;
priestStartside++;
boatnumber--;
break;
}
}
} else if (state == 1) {
for (int i = 0; i < 3; i++) {
if(PriestState[i] == 2){
priests [i].transform.parent = null;
ActionManager.GetInstance ().ApplyMoveGameObjectTo (priests[i],prisetEndpos[i],6,this);
PriestState[i] = 1;
if (Priestsite [i] == 1)
Ifboatsit1have = 0;
else if (Priestsite [i] == 2)
Ifboatsit2have = 0;
Priestsite [i] = 0;
priestEndside++;
boatnumber--;
break;
}
}
}
}
public void BoatGo(){
if (!IQueryGameStatus ())
return;
if(boatnumber != 0){
check ();
if (state == 0) {
ActionManager.GetInstance().ApplyMoveGameObjectTo(Boat,boatEndpos,boatspeed,this);
state = 2;
} else if (state == 1){
ActionManager.GetInstance().ApplyMoveGameObjectTo(Boat,boatStartpos,boatspeed,this);
state = 3;
}
}
}
public bool IQueryGameStatus(){
if (moving == 1) {
return false;
}
else {
moving = 1;
return true;
}
}
public void check(){
print(devilStartside);
print (devilEndside);
print (priestStartside);
print (priestEndside);
if (state == 0) {
if ((devilStartside > priestStartside && priestStartside!=0) || ((3 - devilStartside) > (3 - priestStartside) && (3-priestStartside)!=0)) {
mygame.wl = WinOrLose.Lose;
return;
}
} else if (state == 1) {
if ((devilEndside > priestEndside && priestEndside!=0 ) || ((3 - devilEndside) > (3 - priestEndside) && (3-priestEndside)!=0)) {
mygame.wl = WinOrLose.Lose;
return;
}
}
if(devilStartside == 0 && priestStartside == 0) mygame.wl = WinOrLose.Win;
}
public void OnActionCompleted(U3dAction action){
moving = 0;
}
}
Actions.cs
using UnityEngine;
using System.Collections;
using Com.Mygame;
public class Actions : MonoBehaviour {
GameSceneController mygame;
ImyAction actions;
float BottonW = Screen.width/4;
float BottonH = Screen.height/16;
float firstBx = Screen.width/4;
float firstBy = Screen.height/8;
float blank = 5;
private string str = "点击重置!";
void Start () {
mygame = GameSceneController.GetInstance();
actions = GameSceneController.GetInstance () as ImyAction;
}
void OnGUI(){
if(GUI.Button(new Rect(firstBx,firstBy,BottonW,BottonH), "魔鬼上船")){
actions.DevilGoOnBoat ();
}
if(GUI.Button(new Rect(firstBx+BottonW+blank,firstBy,BottonW,BottonH), "魔鬼下船")){
actions.DevilGoOffBoat ();
}
if(GUI.Button(new Rect(firstBx,firstBy+BottonH+blank,BottonW,BottonH), "牧师上船")){
actions.PriestGoOnBoat ();
}
if(GUI.Button(new Rect(firstBx+BottonW+blank,firstBy+BottonH+blank,BottonW,BottonH), "牧师下船")){
actions.PriestGoOffBoat ();
}
if(GUI.Button(new Rect(firstBx,firstBy+(BottonH+blank)*2,BottonW*2+blank,BottonH*2), "开船!")){
actions.BoatGo ();
if (mygame.wl == WinOrLose.Gaming) str = "点击重置!";
else if (mygame.wl == WinOrLose.Lose) str = "输了...重来!";
else if (mygame.wl == WinOrLose.Win) str = "赢了!再来!";
}
if(GUI.Button(new Rect(Screen.width-BottonW/2,firstBy,BottonW/2,BottonH),str)){
Application.LoadLevel (Application.loadedLevelName);
mygame.wl = WinOrLose.Gaming;
}
}
}