해당 글은 유튜버 골드메탈님의 강의를 바탕으로 작성되었습니다.
이번 강의에서는 젤리를 드래그엔 드롭하여 판매하는 기능을 구현하였습니다.
우선 해당 기능을 구현하기 위해선 마우스의 위치를 가져와야 하는데 그 전에 스크린 좌표계인 마우스의 위치를 월드 좌표계로 변경하기 위해 Camera 객체를 사용해야 합니다.
젤리가 클릭되어 드래그 되는 것을 인지하고 마우스를 따라가도록 하기 위해 다음의 코드를 Jelly 스크립트 내에 추가해주었습니다.
float pick_time;
void OnMouseDrag()
{
pick_time += Time.deltaTime;
if (pick_time < 0.1f) return;
isWalking = false;
anim.SetBool("isWalk", false);
anim.SetTrigger("doTouch");
Vector3 mouse_pos = Input.mousePosition;
Vector3 point = Camera.main.ScreenToWorldPoint(new Vector3(mouse_pos.x, mouse_pos.y, mouse_pos.y));
transform.position = point;
}
void OnMouseUp()
{
pick_time = 0;
}
위 코드는 젤리가 드래그 될 경우에만 실행되며 ScreenToWorldPoint를 통해 마우스의 위치를 월드 좌표계로 변경해주었습니다.
pick_time의 경우 단순 클릭과 드래그를 구분하기 위한 용도로써 0.1초 이상 누르고 있을 경우 드래그, 그렇지 않을 경우 단순 클릭으로 인지하도록 하였습니다.
다음으로 마우스 포인터를 사용하여 젤리를 이동시켰을 때 젤리가 우리가 지정한 맵 바깥으로 나가는 것을 방지해야 합니다.
여기서 저의 경우 이전 시간에 4개의 Border를 만들고 OnTriggerEnter2D() 함수를 사용하여 경계를 지정했었습니다.
하지만 이렇게 할 경우 앞으로 구현해야 할 코드들이 복잡해질 수 있기 때문에 다음과 같이 수정해주었습니다.
우선 빈 오브젝트를 두 개 만들어 각각의 이름을 'LeftTop'과 'RightBottom'으로 지정하고 맵의 경계 역할을 수행할 수 있도록 위치를 조절해주었습니다.
이후 Jelly 스크립트를 다음과 같이 수정해주었습니다.
public GameObject left_top;
public GameObject right_bottom;
void FixedUpdate()
{
if (!isWandering)
StartCoroutine(Wander());
if (isWalking)
Move();
float pos_x = transform.position.x;
float pos_y = transform.position.y;
if (pos_x < left_top.transform.position.x || pos_x > right_bottom.transform.position.x)
speed_x = -speed_x;
if (pos_y > left_top.transform.position.y || pos_y < right_bottom.transform.position.y)
speed_y = -speed_y;
}
이전에 있던 OnTriggerEnter2D() 함수는 모두 지워주었으며 FixedUpdate()에 일부 코드를 추가해주었습니다.
이제 다시 유니티 프로그램으로 돌아가 새로운 변수인 left_top과 right_bottom에 각각 이름에 맞도록 오브젝트를 지정해 줍니다.
여기까지는 수정 작업이었으며 이제 본격적으로 위치 초기화 기능을 구현해보겠습니다.
OnMouseUp() 함수 안에 다음의 코드를 추가합니다.
float pos_x = transform.position.x;
float pos_y = transform.position.y;
if (pos_x < left_top.transform.position.x || pos_x > right_bottom.transform.position.x ||
pos_y > left_top.transform.position.y || pos_y < right_bottom.transform.position.y)
transform.position = new Vector3(0, -1, 0);
위 코드는 보시는 그대로 젤리의 위치가 마우스 포인터에 의해 경계 바깥으로 나가게 될 경우 맵 중앙으로 위치시키는 구문입니다.
다음으로는 마우스 포인터를 이용하여 젤리를 Sell 버튼에 올려놓았을 때 Gold를 얻을 수 있는 시스템을 구현해보겠습니다.
먼저 각 젤리의 가격을 저장하기 위해 GameManger에 변수를 추가해줍니다.
public int[] jelly_goldlist;
유니티 프로그램으로 돌아가 해당 배열의 크기를 12로 지정한 뒤, 가격을 저장해줍니다.
이후 GameManager 스크립트에 아래 코드를 추가로 작성해줍니다.
public bool isSell;
void Awake()
{
isSell = false;
}
public void CheckSell()
{
isSell = isSell == false;
}
이후 유니티 프로그램으로 돌아가 Sell 버튼에 'Event Trigger' 컴포넌트를 추가한 뒤 'Add New Event Type' 버튼을 통해 2개의 버튼 이벤트를 추가하고, 이벤트 발생 시 GameManager의 CheckSell() 함수를 실행하도록 설정해줍니다.
여기서 'Pointer Enter'는 마우스 포인터가 해당 버튼 영역에 들어올 경우 발생하는 이벤트이며
'Pointer Exit'는 마우스 포인터가 해당 버튼 영역에서 벗어날 경우 발생하는 이벤트입니다.
이후 GameManager 스크립트로 돌아가 다음의 코드를 추가해줍니다.
public int max_gold;
public void GetGold(int id, int level)
{
gold += jelly_goldlist[id] * level;
if (gold > max_gold)
gold = max_gold;
}
다음으로 Jelly 스크립트의 OnMouseUp() 함수 안에서 조건을 충족할 때 해당 함수를 호출해줍니다.
void OnMouseUp()
{
pick_time = 0;
if (game_manager.isSell) {
game_manager.GetGold(id, level);
Destroy(gameObject);
}
float pos_x = transform.position.x;
float pos_y = transform.position.y;
if (pos_x < left_top.transform.position.x || pos_x > right_bottom.transform.position.x ||
pos_y > left_top.transform.position.y || pos_y < right_bottom.transform.position.y)
transform.position = new Vector3(0, -1, 0);
}
이렇게 하면 젤리를 든 채로 마우스 포인터를 버튼 위로 옮길 시 GameManager의 isSell 변수는 True로 바뀔 것이며, 그 상태에서 젤리를 놓을 경우 GetGold() 함수를 호출함으로써 골드를 얻음과 동시에 젤리 오브젝트는 Destroy() 함수에 의해 사라질 것입니다.
추가로 이전에 Jelly 스크립트에서 작성했던 jelatin을 얻는 구문을 GetGold() 함수와 마찬가지로 GameManger에서 관리하도록 수정하였습니다.
// Jelly.cs
game_manager.GetJelatin(id, level);
// GameManger.cs
public int max_jelatin;
public void GetJelatin(int id, int level)
{
jelatin += (id + 1) * level;
if (jelatin > max_jelatin)
jelatin = max_jelatin;
}
위의 과정을 모두 성공적으로 마치고 게임을 실행해보면 젤리 판매 기능이 잘 구현된 것을 확인할 수 있습니다.
'📌 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 젤리 키우기 게임 - 3. 클리커 기능 구현 (0) | 2022.03.21 |
[Unity / C#] 2D 젤리 키우기 게임 - 2. 인터페이스 제작 및 기능 구현 (3) | 2022.03.20 |
[Unity / C#] 2D 젤리 키우기 게임 - 1. 도트 장면 만들기 및 AI 구현 (2) | 2022.03.20 |