Unity3D實現立體迷宮尋寶

Unity3D實現立體迷宮尋寶

這個小遊戲是一個白癡在一個昏暗的房間走動找到關鍵得分點,而後通關遊戲。入門Unity3D作的第一款遊戲,比較無聊,但實現了通常的遊戲功能。如,人物控制,碰撞檢測,主控制器等。ide

遊戲界面

123
456

控制代碼

GameManager.cs
主控制腳本:用於控制整個遊戲的主邏輯,屏幕顯示一些提示字符以及遊戲分數,而且根據遊戲邏輯更新數值。同時,檢測按鍵是否須要退出。ui

using UnityEngine;
using System.Collections;

[AddComponentMenu("Game/GameManager")]
public class GameManager : MonoBehaviour {
    public static GameManager Instance = null;

    // 遊戲得分
    public int m_score = 0;
    // 遊戲主角
    Player m_player;

    // UI文字
    GUIText txt_hiscore;
    GUIText txt_score;
	GUIText txt_win;

	// 初始化
	void Start () {
        Instance = this;
        // 得到主角
        m_player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>();

        // 得到設置的UI文字
        txt_score = this.transform.FindChild("txt_score").GetComponent<GUIText>();
		txt_win = this.transform.FindChild("txt_win").GetComponent<GUIText>();
	}
	// 遊戲勝利
	public void setWin(){
		txt_win.gameObject.SetActive (true);
		m_player.enabled = false;
	}
	// 退出遊戲
    void Update(){
        if (Input.GetKeyDown(KeyCode.Escape))
            Application.Quit();
    }
    // 更新分數
    public void SetScore(int score){
        m_score+= score;
        txt_score.text = "Score "+m_score;
    }
}

ItemHit.cs
碰撞檢測腳本:碰撞得分+1,若是是最後一個得分點,則標識遊戲勝利。this

using UnityEngine;
using System.Collections;

public class ItemHit : MonoBehaviour {
	// Use this for initialization
	void Start () {
	
	}

	void OnTriggerEnter(Collider other) {
		//判斷palyer對象是否和得分點接觸
		if( other.tag == "Player" ){
			GameObject.Destroy( this.gameObject );
			GameManager.Instance.SetScore(1);
			//判斷所有得分點都已通過,結束遊戲,打印win
			if( GameObject.FindObjectsOfType<ItemHit>().Length == 1 ){
				GameManager.Instance.setWin();
			}
		}
	}
}

player.cs
人物控制腳本:在這裏能夠控制對象的一些屬性,例如重力數值,移動速度,攝像機參數,初始生命值。
Start( )的時候須要綁定對象;
Update( )的時候須要更新人物位置,而且讓小攝像機追蹤人物,小攝像機用於小地圖顯示人物當前位置。3d

using UnityEngine;
using System.Collections;

[AddComponentMenu("Game/Player")]
public class Player : MonoBehaviour {

    // 組件
    public Transform m_transform;
    CharacterController m_ch;
	
    // 角色移動速度
    float m_movSpeed = 10.0f;

    // 重力
    float m_gravity = 2.0f;
	
    // 攝像機
    Transform m_camTransform;

    // 攝像機旋轉角度
    Vector3 m_camRot;

    // 攝像機高度
    float m_camHeight = 1.4f;

    // 生命值
    public int m_life = 5;

	void Start () {

        // 獲取組件
        m_transform = this.transform;
        m_ch = this.GetComponent<CharacterController>();

        // 獲取攝像機
        m_camTransform = Camera.main.transform;

        // 設置攝像機初始位置
        Vector3 pos = m_transform.position;
        pos.y += m_camHeight;
        m_camTransform.position = pos;
        m_camTransform.rotation = m_transform.rotation;

        m_camRot = m_camTransform.eulerAngles;

        Screen.lockCursor = true;

	}

	void Update () {
        Control();
	}

    void Control(){    
        //獲取鼠標移動距離
        float rh = Input.GetAxis("Mouse X");
        float rv = Input.GetAxis("Mouse Y");

        // 旋轉攝像機
        m_camRot.x -= rv;
        m_camRot.y += rh;
        m_camTransform.eulerAngles = m_camRot;

        // 使主角的面向方向與攝像機一致
        Vector3 camrot = m_camTransform.eulerAngles;
        camrot.x = 0; camrot.z = 0;
        m_transform.eulerAngles = camrot;
		     
        float xm = 0, ym = 0, zm = 0;

        // 重力運動
        ym -= m_gravity*Time.deltaTime;

        // 上下左右運動
        if (Input.GetKey(KeyCode.W)){
            zm += m_movSpeed * Time.deltaTime;
        }
        else if (Input.GetKey(KeyCode.S)){
            zm -= m_movSpeed * Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.A)){
            xm -= m_movSpeed * Time.deltaTime;
        }
        else if (Input.GetKey(KeyCode.D)){
            xm += m_movSpeed * Time.deltaTime;
        }
        //移動
        m_ch.Move( m_transform.TransformDirection(new Vector3(xm, ym, zm)) );

        // 使攝像機的位置與主角一致
        Vector3 pos = m_transform.position;
        pos.y += m_camHeight;
        m_camTransform.position = pos;			      
    }
}

完整工程

傳送門:這裏code

相關文章
相關標籤/搜索