---
# System prepended metadata

title: UnityGame-DungeonEscape程式碼

---

# UnityGame-DungeonEscape程式碼
## 目錄
[TOC]
## Player.cs
``` c#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

public class Player : MonoBehaviour
{
    private Rigidbody2D rb;
    private SpriteRenderer sprite;
    

    public LayerMask groundlayer;

    public float speed;
    public float jumpForce;
    public static int diamonds = 0;
    public int amount;

    bool resetJumpNeeded;
    bool grounded = false;

    PlayerAnimation playerAnimation;

    public class PlayerStats
    {
        public int Health = 100;
    }


    // Start is called before the first frame update
    void Start()
    {
        rb = this.GetComponent<Rigidbody2D>();
        sprite = GetComponentInChildren<SpriteRenderer>();
        playerAnimation = GetComponent<PlayerAnimation>();
    }

    // Update is called once per frame
    void Update()
    { 
        float move = CrossPlatformInputManager.VirtualAxisReference("Horizontal").GetValue;
        float movePos = CrossPlatformInputManager.GetAxis("Horizontal");
        grounded = IsGrounded();

        if(movePos > 0) //往左
        {
            sprite.flipX = false;
            playerAnimation.Move(move);
        }
        else if(movePos < 0) //往右
        {
            sprite.flipX = true;
            playerAnimation.Move(move);
        }

        if ((Input.GetKeyDown(KeyCode.Space) || CrossPlatformInputManager.GetButtonDown("Jump_Button")) && IsGrounded())
        { 
            // 跳躍
            rb.velocity = new Vector2(rb.velocity.x, jumpForce);
            StartCoroutine(ResetJumpNeededRoutine());
            Audio.instance.Playsingle(Audio.instance.playerjumpsound);
            playerAnimation.Jump(true);

        }

        rb.velocity = new Vector2(move * speed, rb.velocity.y);
        
    }

    public void GetDiamonds(int amount)
    {
        diamonds += amount;
        Audio.instance.Playsingle(Audio.instance.playergetdiamonds);
        UIManager.instance.UpdateDiamondsText(diamonds);
    }

    bool IsGrounded() //是否踩地
    {
        RaycastHit2D hitinfo = Physics2D.Raycast(this.transform.position , Vector2.down , 0.8f , groundlayer);
        Debug.Log(hitinfo.collider);
        if(hitinfo.collider != null)
        {
            if (resetJumpNeeded == false)
            {
                playerAnimation.Jump(false);
                return true;
            }
        } 

        return false;
    }
    IEnumerator ResetJumpNeededRoutine() //防止連續跳
    {
        resetJumpNeeded = true;
        yield return new WaitForSeconds(1);
        resetJumpNeeded = false;
    }

}
```

## PlayerAnimation.cs
```c#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerAnimation : MonoBehaviour
{
    Animator anim;
    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponentInChildren<Animator>();

    }

    public void Move(float value)
    {
        anim.SetFloat("Move", Mathf.Abs(value));
    }

    public void Jump(bool value)
    {
        anim.SetBool("Jump", value);
        anim.SetBool("Grounded", false);
    }
}
```

## CameraFollow.cs
```C#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public LayerMask groundlayer;
    public Transform target;
    public Vector3 offsets;
    public float yPosBoundary;

    // Update is called once per frame
    void Update()
    {
        if(target == null)
        {
            return;
        }
        Vector3 newPos = target.position;
            newPos = new Vector3(newPos.x, Mathf.Clamp(newPos.y, yPosBoundary, Mathf.Infinity), newPos.z);
        transform.position = newPos + offsets;   
    }
}
```

## UIManager
```C#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class UIManager : MonoBehaviour
{
    public Text DiamondAmount;
    public GameObject completedpanel;
    public GameObject gameover;

    private static UIManager _instance;

    public static UIManager instance
    {
        get
        {
            if(_instance == null)
            {
                Debug.LogError("UIManger is NULL");
            }
            return _instance;
        }
    }

    private void Awake()
    {
        _instance = this;
    }

    public void UpdateDiamondsText(int count)
    {
        DiamondAmount.text = count.ToString();
    }
    
    public void OpenCompletedPanel()
    {
        completedpanel.SetActive(true);
    }

    public void RetryButton()
    {
        Player.diamonds = 0;
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    public void HomeButton()
    {
        Player.diamonds = 0;
        SceneManager.LoadScene(0);
    }

    public void GameOver()
    {
        gameover.SetActive(true);
    }
}
```
## MainMenu.cs
```c#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class MainMenu : MonoBehaviour
{
    public void StartButton()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
    }
    public void QuitButton()
    {
        Application.Quit();
    }
}
```

## GameMaster.cs
```C#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameMaster : MonoBehaviour
{
    public static GameMaster gm;
    void Start()
    {
        if( gm == null)
        {
            gm = GameObject.FindGameObjectWithTag("GM").GetComponent<GameMaster>();
        }
    }

    public static void KillPlayer(Player player)
    {
        Destroy(player.gameObject);
        UIManager.instance.GameOver();
        AudioSource source = GameObject.FindGameObjectWithTag("BackGroundMusic").GetComponent<AudioSource>();
        Audio.instance.Playsingle(Audio.instance.playerdeathsound);
        source.Stop();  

    }

}
```

## Audio.cs
```C#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Audio : MonoBehaviour
{
    public static Audio instance = null;
    AudioSource audiosource;


    public AudioClip playerdeathsound;
    public AudioClip playerjumpsound;
    public AudioClip playergetdiamonds;
    public AudioClip gamecompletesounds;

    private void Awake()
    {
        if(instance == null)
        {
            instance = this;
        }
        else if (instance != this)
        {
            Destroy(gameObject);
        }

        DontDestroyOnLoad(gameObject);
    }

    public void Playsingle(AudioClip clip)
    {
        audiosource.clip = clip;
        audiosource.Play();
    }

    private void Start()
    {
       audiosource = GetComponent<AudioSource>();
    }

}
```

## DeathWall.cs
```C#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DeathWall : MonoBehaviour
{
    private Rigidbody2D rb;
    private SpriteRenderer sprite;

    public static DeathWall deathwall;
    public float speed;

    private void Awake()
    {
           deathwall = GameObject.FindGameObjectWithTag("DeathWall").GetComponent<DeathWall>();
    }

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>(); 
        sprite = GetComponentInChildren<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        rb.velocity = new Vector2(speed, 0);
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        if(other.tag == "Player")
        {
            Player player = other.GetComponent<Player>();
            if (player != null)
            {
                Debug.Log("player touched");
                GameMaster.KillPlayer(player);
                this.gameObject.SetActive(false);
            }
        }
    }
}
```

## Boundary.cs
```C#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Boundry : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collider)
    {
        if (collider.tag == "Player")
        {
            Player player = collider.GetComponent<Player>();
            if (player != null)
            {
                GameMaster.KillPlayer(player);
                DeathWall.deathwall.gameObject.SetActive(false);
            }
        }
    }
}
```

## Diamond.cs
```C#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Diamond : MonoBehaviour
{
    public int amount;

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == "Player")
        {
            Player player = collision.GetComponent<Player>();

            if(player != null)
            {
                player.GetDiamonds(amount);
                Destroy(this.gameObject);
            }
        }
    }

}
```

## Chest.cs
```C#=
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Chest : MonoBehaviour
{
    [SerializeField] SpriteRenderer sprite_open;
    private void Update()
    {
        if (Player.diamonds >= 10)
        {
            sprite_open.gameObject.SetActive(true);
        }
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (Player.diamonds >= 10)
        {
            if (collision.tag == "Player")
            {
                UIManager.instance.OpenCompletedPanel();
                Audio.instance.Playsingle(Audio.instance.gamecompletesounds);
                DeathWall.deathwall.gameObject.SetActive(false);
            }
        }
    }
}
```