퍼즐
게임에 사용될 퍼즐을 만들어보자.
어떤 알고리즘,아이디어가 들어가면 좋을지 고민이 되지만 첫 번째로는 간단히 특정 위치에 도달하면 완료되는 퍼즐 옮기기를 구현해보자.
public class Puzzle : MonoBehaviour
{
//TODO: 퍼즐위치가 목적지에 위치하면 bool값 true 반환하기 => 퍼즐이 목적지 콜라이더에 닿으면
[SerializeField] private Transform correctPos; // 퍼즐 목적지
[SerializeField] private LayerMask correctPuzzle;
[SerializeField] private Color puzzleColor;
[SerializeField] private bool isChecked = false;
private bool isCorrectPos; //옳바른 위치인지
public event Action<bool> isCorrect; //퍼즐 완성되면 문이 열린다던지 할때 이벤트 호출
private void OnTriggerEnter(Collider other)
{
if (((1<< other.gameObject.layer) & correctPuzzle) != 0)
{
isCorrectPos = true;
isCorrect?.Invoke(isCorrectPos);
Debug.Log("퍼즐완성");
}
}
private void OnTriggerExit(Collider other)
{
if (((1 << other.gameObject.layer) & correctPuzzle) != 0)
{
isCorrectPos = false;
Debug.Log("퍼즐이 떨어짐");
}
}
}
퍼즐미션 클리어 시 문 열리게 하기
using UnityEngine;
public class Door : MonoBehaviour
{
public PuzzleObject[] Puzzles; // 퍼즐 오브젝트 배열
public Animator DoorAnimator; // 문 애니메이션
private void Update()
{
// 모든 퍼즐이 올바른 위치에 있는지 확인
if (CheckAllPuzzles())
{
OpenDoor();
}
}
private bool CheckAllPuzzles()
{
foreach (PuzzleObject puzzle in Puzzles)
{
if (!puzzle.IsInCorrectPosition) return false;
}
return true;
}
private void OpenDoor()
{
DoorAnimator.SetTrigger("Open"); // 문 열기 애니메이션 트리거
// 문이 열리고 플레이어가 다음 단계로 이동
}
}
미션에 사용되는 특정 큐브 밀리기 구현
using UnityEngine;
public class PushableObject : MonoBehaviour
{
public float PushForce = 5f;
private void OnCollisionStay(Collision collision)
{
if (collision.gameObject.CompareTag("Player"))
{
Vector3 pushDirection = collision.transform.forward;
GetComponent<Rigidbody>().AddForce(pushDirection * PushForce, ForceMode.Force);
}
}
}
스위치로 문열기
using UnityEngine;
public class Switch : MonoBehaviour
{
public Door ConnectedDoor; // 연결된 문
private int objectsOnSwitch = 0; // 스위치 위의 오브젝트 수
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("PuzzleObject"))
{
objectsOnSwitch++;
if (objectsOnSwitch == 1)
{
ConnectedDoor.OpenDoor(); // 문 열기
}
}
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("PuzzleObject"))
{
objectsOnSwitch--;
}
}
}
내일은 3match알고리즘을 이용하여 3개의 퍼즐이 모이면 사라지는 부분을 구현해봐야겠다.