完成品: 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(內附教學文件)
