物理系统与碰撞
改进飞碟(Hit UFO)游戏
- 游戏内容要求:
- 按 adapter模式 设计图修改飞碟游戏
- 使它同时支持物理运动与运动学(变换)运动
这次作业时对上次作业的一次改进。
- 将Base中关于action的部分提出来,单独建立action_Adapter.cs,首先定义interface接口。
1 2 3 4 5 6 7 8 9
| public interface UFO_action { void SetSpeed(int speed); void Start(); void Running(bool run); GameObject getUFO(); void setUFO(GameObject ufo); void Update(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public void SetSpeed(int speed) { this.speed = speed; } public void Running(bool run) { this.running = run; } public GameObject getUFO() { return this.ufo; } public void setUFO(GameObject ufo) { this.ufo = ufo; }
|
- 将原来factory中的函数调用进行修改,使得与adapter适应。此时游戏可以正常运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| public void hitted(GameObject g) { if (g.gameObject.GetComponent<MeshRenderer>().material.color==Color.white) { score += 1; } else if (g.gameObject.GetComponent<MeshRenderer>().material.color==Color.gray) { score += 2; } else if (g.gameObject.GetComponent<MeshRenderer>().material.color==Color.black) { score += 3; } this.used.Remove(g); g.transform.position = new Vector3(0, -20, 0); for(int i = 0; i < 10; i++) { if (Act[i].getUFO() == g) Act [i].Running (false); } this.notUsed.Add(g); } public void miss(GameObject g) { this.used.Remove(g); g.transform.position = new Vector3(0, -20, 0); for (int i = 0; i < 10; i++) { if (Act[i].getUFO() == g) Act [i].Running (false); } this.notUsed.Add(g); }
public void newRound(int round) { for(int i = 0; i < 10; i++) { used.Add(notUsed[0]); notUsed.Remove(notUsed[0]); Act[i].SetSpeed(round + 2); Act[i].Start(); Act [i].Running (true); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| public class physics_actions : ScriptableObject, UFO_action { public director director; public GameObject ufo; Vector3 start; Vector3 end; public int speed = 5; public bool running = true; int framecount = 0; public int recordType;
public void SetSpeed(int speed) { this.speed = speed; } public void Running(bool run) { this.running = run; } public GameObject getUFO() { return this.ufo; } public void setUFO(GameObject ufo) { this.ufo = ufo; }
public void Start() { director = director.getInstance(); if (ufo.GetComponent<Rigidbody>() == null) ufo.AddComponent<Rigidbody>(); start = new Vector3(Random.Range(-6, 6), Random.Range(-6, 6), 0); if (start.x < 10 && start.x > -10) start.x *= 5; if (start.y < 10 && start.y > -10) start.y *= 5; end = new Vector3(-start.x, -start.y, 0); ufo.transform.position = start; foreach (Transform child in ufo.transform) { child.gameObject.GetComponent<MeshRenderer>().material = Material.Instantiate(Resources.Load("Prefabs/tough", typeof(Material))) as Material; } int typeOfUFO = Random.Range(1, 4); recordType = typeOfUFO; switch (typeOfUFO) { case 1: ufo.GetComponent<MeshRenderer>().material.color = Color.white; break; case 2: ufo.GetComponent<MeshRenderer>().material.color = Color.gray; break; case 3: ufo.GetComponent<MeshRenderer>().material.color = Color.black; break; default: break; } Rigidbody rigit = ufo.GetComponent<Rigidbody>(); rigit.velocity = (end - start) * speed * Random.Range(0.001f, 0.06f); rigit.useGravity = false; }
public void Update() { framecount++; if (framecount > 1000) this.director.currentController.factory.miss(this.ufo);
Rigidbody rigit = ufo.GetComponent<Rigidbody>(); if (running == false) { rigit.velocity = Vector3.zero; framecount = 0; } if (ufo.transform.position.x < -100 || ufo.transform.position.x > 100 || ufo.transform.position.x < -100 || ufo.transform.position.x > 100 || ufo.transform.position.x < -100 || ufo.transform.position.x > 100) { rigit.velocity = Vector3.zero; this.director.currentController.factory.miss(this.ufo); } } }
|
修改UI和factory中相关函数
1 2 3 4 5 6 7 8 9 10 11 12
| if (GUI.Button(new Rect(0.5f * Screen.width-75, 0.5f * Screen.height - 55, 150, 50), "运动学运动")) { start = false; _director.currentController.factory.physics = false; _director.currentController.factory.enabled = true; } if (GUI.Button(new Rect(0.5f * Screen.width - 75, 0.5f * Screen.height+5, 150, 50), "物理运动")) { start = false; _director.currentController.factory.physics = true; _director.currentController.factory.enabled = true; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| if (physics) { for (int i = 0; i < 10; i++) { Act.Add(physics_actions[i]); } } else { for (int i = 0; i < 10; i++) { Act.Add(actions[i]); } }
|
打靶游戏
- 游戏内容要求:
- 靶对象为 5 环,按环计分;
- 箭对象,射中后要插在靶上
- 增强要求:射中后,箭对象产生颤抖效果,到下一次射击 或 1秒以后
- 游戏仅一轮,无限 trials;