Unity3D-Game5

game5

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

發佈留言