해당 글은 유튜버 골드메탈님의 강의를 바탕으로 작성되었습니다.
이번 강의에서는 젤리가 성장하는 클리커 시스템을 구현하여 재화를 획득하고 젤리를 성장시키는 기능을 추가하였습니다.
우선 젤리가 마우스 클릭을 인식할 수 있도록 이전 시간에 추가해주었던 Collider와 함께 Jelly 스크립트에 다음의 코드를 추가해주었습니다.
void OnMouseDown()
{
isWalking = false;
anim.SetBool("isWalk", false);
anim.SetTrigger("doTouch");
}
위의 코드를 통해 게임 상에서 젤리를 클릭할 시 젤리의 이동이 멈추고 Walk 애니메이션이 멈춤과 동시에 Click 애니메이션이 실행되는 것을 확인할 수 있습니다. 이후 시간이 지나면 다시 정상적으로 코루틴을 돌며 움직이는 모습을 확인할 수 있습니다.
다음으로 재화 시스템과 연결시켜 현재 소지하고 있는 재화를 증가시키는 기능을 구현하였습니다.
우선 젤리의 level에 따라 얻는 재화의 크기를 다르게 하기 위해서 Jelly 오브젝트에 새로운 변수 id와 level을 추가해주었으며 id 변수는 0으로 level 변수는 1로 설정해주었습니다.
public int id;
public int level;
또한 GameManager에서 관리하는 재화 정보를 Jelly 스크립트 내에서 활용하기 위해 아래의 코드를 작성하고 GameManager 객체를 Jelly 스크립트 내에 추가해주었습니다.
public GameManager game_manager;
이후 OnMouseDown() 함수 안에 아래의 코드를 추가하여 id와 level에 비례하여 얻는 재화가 증가하도록 구현하였습니다.
if(game_manager.jelatin < 99999999)
game_manager.jelatin += (id + 1) * level;
위의 설정을 마친 뒤, 게임을 실행해보면 젤리를 클릭할 때마다 jelatic의 크기가 증가하는 것을 확인할 수 있습니다.
이제 젤리를 클릭할 때마다 젤리의 level을 증가시키고 level에 따라 Animator를 변경하여 게임 상에서 젤리의 레벨 업을 표시하는 작업을 수행해주겠습니다.
먼저 level이 오르는 기준을 만들기 위해 Jelly 스크립트에 다음과 같이 exp 변수를 생성해주었습니다.
public float exp;
다음으로 GameManager 내에 Animator 변경을 관리하기 위해 다음과 같이 Animator 배열과 함수를 추가해주었습니다.
public RuntimeAnimatorController[] level_ac;
public void ChangeAc(Animator anim, int level)
{
anim.runtimeAnimatorController = level_ac[level - 1];
}
ChangeAc() 함수는 Jelly 스크립트에서 Animator 객체와 level을 받아와 runtimeAnimatorController를 통해 해당 젤리의 레벨에 따라 Animator를 변경하는 역할을 수행합니다.
여기서 level_ac 배열의 최대 크기는 3이며, level 값은 1부터 3까지로 level 값이 배열의 크기를 벗어나지 않도록 -1을 해주어야 합니다.
이후 Jelly 스크립트로 돌아와 OnMouseDown() 함수에 아래의 코드를 추가해주었습니다.
if(++exp > 50 * level && level < 3)
game_manager.ChangeAc(anim, ++level);
저의 경우 영상과 마찬가지로 레벨에 비례하여 레벨 업에 요구되는 exp의 크기를 증가시켰으며 그 수치는 자유롭게 설정하셔도 상관 없습니다.
이제 유니티 프로그램으로 돌아와서 GameManager에 추가된 level_ac 배열에 각각의 Animator를 추가해줍니다.
이후 게임을 실행시킨 뒤 젤리를 클릭하다보면 exp 값이 요구 수치를 넘어가는 순간 Animator가 바뀌면서 젤리의 크기가 커지는 것을 확인할 수 있습니다.
추가적으로 시간이 지남에 따라 자동적으로 exp를 얻는 시스템을 구현해주었습니다.
우선 Jelly 스크립트의 OnMouseDown() 함수를 다음과 같이 수정해주었습니다.
void OnMouseDown()
{
isWalking = false;
anim.SetBool("isWalk", false);
anim.SetTrigger("doTouch");
++exp;
if (game_manager.jelatin < 99999999)
game_manager.jelatin += (id + 1) * level;
}
이후 Update() 함수를 추가하여 다음과 같이 작성해주었습니다.
void Update()
{
exp += Time.deltaTime;
if (exp > 50 * level && level < 3)
game_manager.ChangeAc(anim, ++level);
}
이렇게 하면 exp 변수에 초당 1씩 더해지면서 시간이 지남에 따라 자연스럽게 레벨이 상승하게 됩니다.
추가 및 수정
젤리의 exp 수치에 최댓값 제한을 두어 해당 exp 수치까지 도달하게 되면 더 이상 exp 증가 작업을 하지 않도록 Jelly 스크립트 코드를 수정하였습니다.
또한 변수 추가에 따라 유니티 프로그램에서 따로 수치를 지정해주었습니다.
저의 경우 required_exp는 50으로, max_exp는 그와 비례하여 100으로 설정해주었습니다.
Jelly Script
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Jelly : MonoBehaviour
{
public int id;
public int level;
public float exp;
public float required_exp;
public float max_exp;
public GameManager game_manager;
int move_delay;
int move_time;
float speed_x;
float speed_y;
bool isWandering;
bool isWalking;
SpriteRenderer sprite;
Animator anim;
void Awake()
{
sprite = GetComponent<SpriteRenderer>();
anim = GetComponent<Animator>();
isWandering = false;
isWalking = false;
}
void Update()
{
if(exp < max_exp)
exp += Time.deltaTime;
if (exp > required_exp * level && level < 3)
game_manager.ChangeAc(anim, ++level);
}
void FixedUpdate()
{
if (!isWandering)
StartCoroutine(Wander());
if (isWalking)
Move();
}
void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.name.Contains("Bottom") || collision.gameObject.name.Contains("Top"))
speed_y = -speed_y;
else if (collision.gameObject.name.Contains("Left") || collision.gameObject.name.Contains("Right"))
speed_x = -speed_x;
}
void OnMouseDown()
{
isWalking = false;
anim.SetBool("isWalk", false);
anim.SetTrigger("doTouch");
if(exp < max_exp) ++exp;
if (game_manager.jelatin < 99999999)
game_manager.jelatin += (id + 1) * level;
}
void Move()
{
if (speed_x != 0)
sprite.flipX = speed_x < 0;
transform.Translate(speed_x, speed_y, speed_y);
}
IEnumerator Wander()
{
move_delay = 6;
move_time = 3;
speed_x = Random.Range(-0.8f, 0.8f) * Time.deltaTime;
speed_y = Random.Range(-0.8f, 0.8f) * Time.deltaTime;
isWandering = true;
yield return new WaitForSeconds(move_delay);
isWalking = true;
anim.SetBool("isWalk", true);
yield return new WaitForSeconds(move_time);
isWalking = false;
anim.SetBool("isWalk", false);
isWandering = false;
}
}
'📌 etc > Unity 2D Raising Jelly Game' 카테고리의 다른 글
[Unity / C#] 2D 젤리 키우기 게임 - 6. 해금 시스템 만들기 (0) | 2022.03.26 |
---|---|
[Unity / C#] 2D 젤리 키우기 게임 - 5. UI 창 구축하기 (0) | 2022.03.23 |
[Unity / C#] 2D 젤리 키우기 게임 - 4. 젤리 판매 기능 구현 (0) | 2022.03.22 |
[Unity / C#] 2D 젤리 키우기 게임 - 2. 인터페이스 제작 및 기능 구현 (3) | 2022.03.20 |
[Unity / C#] 2D 젤리 키우기 게임 - 1. 도트 장면 만들기 및 AI 구현 (2) | 2022.03.20 |