完成品: Unity3D-Game5
設定:
Plane
|
V
Stand
Create Empty
Reset
Can
Add -> Cylinder
tag: Can
Delete -> Sphere Collider
tick -> Mesh Collider/convex
Add -> Rigidbody
canPrefab
|
V
Cans
Create Empty
Reset
target
Add -> Cylinder
tag: ShootingObject
Delete -> Capsule Collider
Add -> Mesh Collider
targetPrefab
|
V
spawner
Create Empty
Reset
Add -> ObjectSpawner.cs
targetPrefab
Spawn Direction: Left\Right
|
V
(Scene) targetSpawner
Create Empty
Reset
Rotation X: 90
Main Camera
tag: MainCamera
Audio Clip: targethit
Add -> PlayerInput.cs
Can Sound: Tick
Add -> GameManager.cs
程式碼:
GameManager.cs
using UnityEngine; using System.Collections; public class GameManager : MonoBehaviour { public static GameManager SP; // 設定標靶陣列, 速度, 數量 private ArrayList objectsList; private float moveSpeed = 1.5f; private int spawnedObjects = 0; // 設定分數 private int score; void Awake () { SP = this; objectsList = new ArrayList(); spawnedObjects = score =0; } void Update() { //Move objects for (int i = objectsList.Count - 1; i >= 0; i--) { // 標靶左或右可移動範圍 float farLeft = -10; float farRight = 10; // 標靶左或右移動 MovingObject movObj = (MovingObject)objectsList[i]; Transform trans = movObj.transform; trans.Translate((int)movObj.direction * Time.deltaTime * moveSpeed, 0, 0); // 超過標靶左或右可移動範圍, 該標靶消失和在陣列中移除 if (trans.position.x < farLeft || trans.position.x > farRight) { Destroy(trans.gameObject); objectsList.Remove(movObj); } } } void OnGUI(){ if(GUILayout.Button("Restart")){ Application.LoadLevel(Application.loadedLevel); } GUILayout.Label(" Hit: " + score + "/" + spawnedObjects); } // 標靶加入陣列中 public void AddTarget(MovingObject newObj){ spawnedObjects++; objectsList.Add(newObj); } // 標靶移除陣列中, 加分 public bool RemoveObject(Transform trans) { foreach (MovingObject obj in objectsList) { if (obj.transform == trans) { score++; objectsList.Remove(obj); Destroy(obj.transform.gameObject); return true; } } Debug.LogError("ERROR: Couldn't find target!"); return false; } } // 作者: http://www.m2h.nl/ // 原檔案: https://www.assetstore.unity3d.com/#/content/116(內附教學文件)
ObjectSpawner.cs
using UnityEngine; using System.Collections; // 標靶移動設定 public class MovingObject{ // 標靶方向 public DirectionEnum direction; //-1 or 1; public Transform transform; public MovingObject(DirectionEnum dir, Transform trans) { direction = dir; transform = trans; } } [System.Serializable] // 定義常數--標靶左, 標靶右 public enum DirectionEnum{left = -1, right= 1} public class ObjectSpawner : MonoBehaviour { // 加入標靶物件 public Transform objectPrefab; // 預設標靶方向 public DirectionEnum spawnDirection = DirectionEnum.right; public static ObjectSpawner SP; private float farLeft; private float farRight; private float lastSpawnTime; private float spawnInterval; void Awake () { SP = this; // 標靶在時間範圍生成 spawnInterval = Random.Range(3.5f, 5.5f); lastSpawnTime = Time.time + Random.Range(0.0f, 1.5f); } void Update () { //Spawn new object.. 標靶生成 if ((lastSpawnTime + spawnInterval) < Time.time) { SpawnObject(); } } void SpawnObject() { lastSpawnTime = Time.time; spawnInterval *= 0.99f;//Speed up spawning 加速時間標靶生成 // -1 or 1 標靶左,右方向 DirectionEnum direction = spawnDirection; // 複製標靶 Transform newObj = (Transform)Instantiate(objectPrefab, transform.position, transform.rotation); MovingObject movObj = new MovingObject(direction, newObj); // 載入 GameManager AddTarget GameManager.SP.AddTarget( movObj ); } } // 作者: http://www.m2h.nl/ // 原檔案: https://www.assetstore.unity3d.com/#/content/116(內附教學文件)
PlayerInput.cs
using UnityEngine; using System.Collections; public class PlayerInput : MonoBehaviour { // 罐頭聲音 public AudioClip canHitSound; void Update () { // 左鍵滑鼠點擊 if(Input.GetMouseButtonDown(0)){ Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); RaycastHit hit; if (Physics.Raycast (ray, out hit, 100)) { // 攝影機由滑鼠點擊畫出線條 Debug.DrawLine (ray.origin, hit.point); // 滑鼠點擊標靶 發出targethit 聲音 if (hit.transform.tag == "ShootingObject") { audio.pitch = Random.Range(0.9f, 1.3f); audio.Play(); GameManager.SP.RemoveObject(hit.transform); // 滑鼠點擊罐頭移動 發出Tick 聲音 } else if(hit.transform.tag == "Can"){ audio.PlayOneShot(canHitSound); Vector3 explosionPos = transform.position; hit.rigidbody.AddExplosionForce(5000, explosionPos, 25.0f, 1.0f); } } } } } // 作者: http://www.m2h.nl/ // 原檔案: https://www.assetstore.unity3d.com/#/content/116(內附教學文件)