Unity 이동 및 병합기능 만들기

안녕하세요! 오늘은 Unity를 사용해서 3-Match 퍼즐 게임에서 캐릭터를 이동시키는 간단한 로직을 공유하려고 합니다. 저도 이제 막 Unity를 시작한 초보 개발자라서, 함께 배워가면서 이런 블로그를 작성하게 되었어요.

코드들은 매일 수정되어 업데이트 될 예정입니다.

코드 소개

using UnityEngine;  
using UnityEngine.EventSystems;  
using System.Collections;  
  
public class MovementManager : MonoBehaviour  
{  
public float moveDuration = 0.3f;  
public CountManager countManager;  
public float hoverScaleFactor = 1.1f;  
  
private GameObject selectedCharacter;  
private Vector3 originalScale;  
  
private void Update()  
{  
	if (Input.GetMouseButtonDown(0))  
	{  
		Vector3 MousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);  
		RaycastHit2D hit;  
		int layerMask = LayerMask.GetMask("Character");  
		Debug.Log(MousePos);  
		hit = Physics2D.Raycast(MousePos, transform.forward, 10f, layerMask);  
		if (hit.collider != null)  
		{  
			Debug.Log("Click");  
			if (hit.collider.gameObject.CompareTag("Character") 
			&& countManager.CanMove())  
			{  
				selectedCharacter = hit.collider.gameObject;  
				originalScale = selectedCharacter.transform.localScale;  
				selectedCharacter.transform.localScale *= hoverScaleFactor;  
			}  
		}  
	}  
  
	if (Input.GetMouseButtonUp(0) && selectedCharacter != null)  
	{  
		selectedCharacter.transform.localScale = originalScale;  
		  
		Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);  
		RaycastHit hit;  
		if (Physics.Raycast(ray, out hit, Mathf.Infinity))  
		{  
			GameObject targetCharacter = hit.collider.gameObject;  
			if (targetCharacter.CompareTag("Character") 
			&& CanMove(selectedCharacter.transform.position, 
			targetCharacter.transform.position))  
			{  
				StartCoroutine(SwapCharacters(selectedCharacter, 
				targetCharacter));  
				countManager.DecreaseMoveCount();  
			}  
		}  
		selectedCharacter = null;  
	}  
}  
  
private bool CanMove(Vector3 pos1, Vector3 pos2)  
{  
	float distance = Vector3.Distance(pos1, pos2);  
	return distance <= 1.5f && countManager.CanMove();  
}  
  
public IEnumerator SwapCharacters(GameObject character1, GameObject character2)  
{  
	Vector3 initialPos1 = character1.transform.position;  
	Vector3 initialPos2 = character2.transform.position;  
  
	float elapsedTime = 0f;  
  
	while (elapsedTime < moveDuration)  
	{  
		elapsedTime += Time.deltaTime;  
  
		character1.transform.position = 
		Vector3.Lerp(initialPos1, initialPos2, elapsedTime / moveDuration);  
		character2.transform.position = 
		Vector3.Lerp(initialPos2, initialPos1, elapsedTime / moveDuration);  
  
	yield return null;  
	}  
  
	character1.transform.position = initialPos2;  
	character2.transform.position = initialPos1;  
  
	Debug.Log($"Moved character to ({initialPos2.x}, {initialPos2.y})");  
	}  
}

여기서 사용된 네임스페이스와 클래스는 Unity에서 제공하는 기본적인 것들이에요.

변수들

  • moveDuration: 캐릭터가 이동하는 데 걸리는 시간입니다.
  • countManager: 캐릭터를 몇 번 움직일 수 있는지 관리하는 매니저입니다.
  • hoverScaleFactor: 마우스로 캐릭터를 선택했을 때 커지는 배율입니다.

마우스 이벤트 처리

  • Input.GetMouseButtonDown(0): 마우스 왼쪽 버튼을 눌렀을 때의 로직. 캐릭터를 선택하면 그 캐릭터는 조금 커집니다.
  • Input.GetMouseButtonUp(0): 마우스 왼쪽 버튼을 뗐을 때의 로직. 선택한 캐릭터를 다른 위치로 이동시킵니다.

이동 가능 여부 확인

  • CanMove(): 두 캐릭터의 위치가 주어진 범위 내에 있는지와 이동 가능한 횟수가 남아 있는지 확인합니다.

캐릭터 스왑

  • SwapCharacters(): 두 캐릭터의 위치를 스왑하는 코루틴입니다.

마치며

Unity로 간단한 3-Match 퍼즐 게임의 이동 로직을 만들어 보았습니다. 아직 많이 부족하지만 함께 공부하면서 발전해 나가려고 합니다. 조언이나 피드백은 언제나 환영입니다!