[Bounce Game] ๐ฅ ๋ฏธ๋๊ฒ์ ๋ง๋ค๊ธฐ 3
1. GameManager ๋ง๋ค๊ธฐ
ํ๋ ์ดํ๊ณ ์๋ ์ฌ๋์ ID, ํด๋ฆฌ์ด ํ ์คํ
์ด์ง ๊ฐ์, ํ๋ ์ด์ด ์ ์, DeathCount๋ฑ์ ๊ธฐ๋กํ๊ธฐ ์ํ SingleTon
์ GameManager
๋ฅผ ๋ง๋ค์ด์ค๋ค.
์ด๋ฅผ ์ํ์ฌ GameManager
์ด๋ฆ์ Script
๋ฅผ ๋ง๋ค์ด ์ค ๋ค ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
public static Bounce_GameManager instance = null;
public string ID;
public int Current_Stage;
public int Clear_Stage;
public int Current_Score;
public int Score;
public int Death_Count;
private void Awake()
{
if (instance == null) //instance๊ฐ null. ์ฆ, ์์คํ
์์ ์กด์ฌํ๊ณ ์์ง ์์๋
{
instance = this; //๋ด์์ ์ instance๋ก ๋ฃ์ด์ค๋๋ค.
DontDestroyOnLoad(gameObject); //OnLoad(์ฌ์ด ๋ก๋ ๋์์๋) ์์ ์ ํ๊ดดํ์ง ์๊ณ ์ ์ง
}
else
{
if (instance != this) //instance๊ฐ ๋ด๊ฐ ์๋๋ผ๋ฉด ์ด๋ฏธ instance๊ฐ ํ๋ ์กด์ฌํ๊ณ ์๋ค๋ ์๋ฏธ
Destroy(this.gameObject); //๋ ์ด์ ์กด์ฌํ๋ฉด ์๋๋ ๊ฐ์ฒด์ด๋ ๋ฐฉ๊ธ AWake๋ ์์ ์ ์ญ์
}
}
์ด์ ๊ฒ์ ํ๋ ์ด ๋์ค Scene
์ด ๋ฐ๋๋๋ผ๋ ์ด ์ค๋ธ์ ํธ๋ ์ ์ง๋๊ฒ ๋๋ค.
์ด์ ์ฃฝ์์์ DeathCount
๋ฅผ ์นด์ดํธ ํ๊ธฐ ์ํ์ฌ ์ํ์ฌ Player
Script์ ๋์๊ฐ์
public GameObject Game_Manager;
๋ฅผ ์ถ๊ฐํด์ค๋ค ๋ค์ ์ฝ๋๋ฅผ ๋ฃ์ด๋๋ค.
void Death()
{
rigid.velocity = rigid.velocity * 0;
transform.position = Start_Point;
Game_Manager.GetComponent<Bounce_GameManager>().Death_Count += 1;
Game_Manager.GetComponent<Bounce_GameManager>().Current_Score = 0;
for (int i = 0; i < Coins.transform.childCount; i++){
Coins.transform.GetChild(i).gameObject.SetActive(true);
}
for (int i = 0; i < Weak_Floors.transform.childCount; i++)
{
Weak_Floors.transform.GetChild(i).gameObject.SetActive(true);
}
}
2. ์ฝ์ธ ์ํธ์์ฉ ๊ตฌํํ๊ธฐ
์ฝ์ธ์ ๋จน์์์ ์ ์๊ฐ ์ค๋ฅด๊ณ ์ฝ์ธ ์ค๋ธ์ ํธ๋ ์ ์ ๋นํ์ฑํ๊ฐ ๋์ฌ์ผ๋ง ํ๋ค. ๋ํ ์ฃฝ์์๋ ๋จน์ ์ ์๊ฐ ์ด๊ธฐํ๋๊ณ , ์ฝ์ธ์ด ๋ค์ ํ์ฑํ๊ฐ ๋์ด์ผ ํ๋ค.
Player
์คํฌ๋ฆฝํธ์ ๋ค์ด๊ฐํ public GameObject Coins;
์ฝ๋๋ฅผ ๋ฃ์ด์ค๋ค.
์ด๋ฅผ ์ํ์ฌ ๋ฐฉ๊ธ์ ์ ๋ง๋ Death
ํจ์์ ๋ค์ ์ฝ๋๋ฅผ ๋ฃ๋๋ค.
for (int i = 0; i < Coins.transform.childCount; i++){
Coins.transform.GetChild(i).gameObject.SetActive(true);
}
์ดํ Coin
Scripts๋ฅผ ๋ง๋ค์ด์คํ ๋ค์ ์ฝ๋๋ฅผ ๋ฃ๋๋ค.
public GameObject Game_Manager;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Player"))
{
gameObject.SetActive(false);
Game_Manager.GetComponent<Bounce_GameManager>().Current_Score += 1;
}
}
Unity์ ๋์๊ฐ์ Create Empty
๋ฅผ ๋ง๋ ํ ์ด๋ฆ์ Coins
๋ก ๋ฐ๊พผํ ๋ชจ๋ Coin
์ค๋ธ์ ํธ๋ฅผ ๋ฃ์ด์ค๋ค. ๊ฐ๊ฐ์ Coin
๋ค์๊ฒ ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ฃ์ด์ค๋ค. ๋ Player
์ค๋ธ์ ํธ์ Coins
๋ณ์์ Coins
์ค๋ธ์ ํธ๋ฅผ ๋์ด๋ค๊ฐ ๋ฃ์ด์ค๋ค.
3. ๋ชฌ์คํฐ AI ๊ตฌํํ๊ธฐ
๋ชฌ์คํฐ๋ ๊ฐ๋งํ ๋ฉ์ถฐ ์๋๊ฒ ์๋๋ผ ์ค์ค๋ก ์๊ฐ์ ๊ฐ์ง๊ณ ์์ง์ฌ์ผ ํ๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด 3๊ฐ์ง๋ฅผ ๊ตฌํํ๊ธฐ๋ก ํ์๋ค.
- 2์ด๋ง๋ค ์์ผ๋ก ๊ฐ๊ธฐ, ์ ์ง, ๋ค๋ก๊ฐ๊ธฐ
- ์งํ๋ฐฉํฅ์ ๋ฐํ์ด ์์ ๊ฒฝ์ฐ ๋ฐฉํฅ ์ ํํ๊ธฐ
- ๋ฐฉํฅ์ ์ ํํ๊ฑฐ๋ ๋ค๋ก ๊ฐ ๋, ์บ๋ฆญํฐ๊ฐ ์ข์ฐ๋ฐ์ ๋๊ฒ ํ๊ธฐ
์ด๋ฅผ ์ํ์ฌ ๋ค์๊ณผ ๊ฐ์ด Raycast
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋๋ฐฉํฅ์ ๋ฐํ์ด ์๋์ง ์ฒดํฌํ์๊ณ , Coroutine
๋ฅผ ์ฌ์ฉํ์ฌ, 2์ด๋ง๋ค Random.range
์ผ๋ก -1, 0, 1
์ ๋ฐฉํฅ์ด ๋ฌด์์๋ก ๋์ค๋๋ก ํ์๋ค.
Rigidbody2D rigid;
public int next_Move;
float currnetRotation;
SpriteRenderer spriteRenderer;
// Start is called before the first frame update
void Start()
{
currnetRotation = -1;
rigid = GetComponent<Rigidbody2D>();
spriteRenderer = GetComponent<SpriteRenderer>();
StartCoroutine(Think());
StartCoroutine(Monster_Move());
StartCoroutine(turn());
}
// Update is called once per frame
void Update()
{
}
IEnumerator Monster_Move()
{
while (true)
{
rigid.velocity = new Vector2(next_Move * 2, rigid.velocity.y);
//Platform Check
Vector2 frontVec = new Vector2(rigid.position.x + next_Move, rigid.position.y);
Debug.DrawRay(frontVec, Vector3.down, new Color(0, 1, 0)); //์ด๋ก์
RaycastHit2D rayHit = Physics2D.Raycast(frontVec, Vector3.down, 1, LayerMask.GetMask("platform"));
if (rayHit.collider == null)
{
next_Move = -1 * next_Move;
}
yield return null;
}
}
IEnumerator Think()
{
while (true)
{
next_Move = Random.Range(-1, 2);
yield return new WaitForSeconds(2);
}
}
IEnumerator turn()
{
while (true)
{
spriteRenderer.flipX = next_Move == 1;
yield return null;
}
}
4. ์ฝํ ๋ฐํ ๊ตฌํํ๊ธฐ
์ฝํ ๋ฐํ ๊ฐ์ ๊ฒฝ์ฐ ๋ฐ์ผ๋ฉด ์ค๋ธ์ ํธ๊ฐ ์ฌ๋ผ์ง๊ณ , Death
๊ฐ ๋ฐ๋ ์ ๋ค์ ์๊ฒจ์ผ ํ๋ค. ๋ฐ๋ผ์ Coin
๊ณผ ๋น์ทํ๊ฒ Player
์คํฌ๋ฆฝํธ์ public GameObject Weak_Floors;
๋ฅผ ๋ฃ์ด์ค๋ค.
์ดํ Death
ํจ์์ ๋ค์ ์ฝ๋๋ฅผ ๋ฃ์ด์ค๋ค.
for (int i = 0; i < Weak_Floors.transform.childCount; i++){
Weak_Floors.transform.GetChild(i).gameObject.SetActive(true);
}
Weak Floors Set
์ด๋ฆ์ผ๋ก Empty Object
๋ฅผ ๋ง๋ค์ด์ค๋ค. ์ดํ ๋ชจ๋ Weak Floor
๋ฅผ Weak Floors Set
์ ๋ฃ์ด์ค๋ค. Player
์ค๋ธ์ ํธ์ Weak_Floors
๋ณ์์ Weak Floors Set
์ ๋ฃ์ด์ค๋ค.
public GameObject Weak_Floors;
์๋ก์ด ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ ํ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ๋ฃ์ด์ค๋ค Weak FloorTop
์ค๋ธ์ ํธ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
private void OnCollisionEnter2D(Collision2D collision)
{
if(collision.collider.CompareTag("Player")){
gameObject.transform.parent.gameObject.SetActive(false);
}
}
5. ์์ง์ด๋ ๋ฐํ ๊ตฌํํ๊ธฐ
์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ ํ Moving Floor
์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
๋ชฌ์คํฐ์์ ์ฌ์ฉํ Raycast
๋ฅผ ๋ณํํ์ฌ ์ฌ์ฉํ์๋ค.
Rigidbody2D rigid;
public float next_Move;
void Start()
{
rigid = GetComponent<Rigidbody2D>();
next_Move = 1;
StartCoroutine(Move());
}
IEnumerator Move()
{
while (true)
{
rigid.velocity = new Vector2(next_Move * 2, rigid.velocity.y);
//Platform Check
Vector2 frontVec = new Vector2(rigid.position.x + next_Move / 1.8f, rigid.position.y);
Debug.DrawRay(frontVec, Vector3.right * next_Move, new Color(0, 1, 0)); //์ด๋ก์
RaycastHit2D rayHit = Physics2D.Raycast(frontVec, Vector3.down, 1, LayerMask.GetMask("platform"));
if (rayHit.collider != null)
{
next_Move = -1 * next_Move;
}
yield return null;
}
}
6. ๊ตฌ๋ ํ๋ฉด
์ดํ ์ ์์ ์ผ๋ก ์ ๊ตฌ๋๋๋ ๋ชจ์ต์ด๋ค.
๊ฐ์ธ ๊ณต๋ถ ๊ธฐ๋ก์ฉ ๋ธ๋ก๊ทธ์
๋๋ค.
ํ๋ฆฌ๊ฑฐ๋ ์ค๋ฅ๊ฐ ์์ ๊ฒฝ์ฐ ์ ๋ณดํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.๐