Unity_개발일지_28

홍신영·2024년 11월 28일
0

Unity

목록 보기
30/62

퍼즐

게임에 사용될 퍼즐을 만들어보자.
어떤 알고리즘,아이디어가 들어가면 좋을지 고민이 되지만 첫 번째로는 간단히 특정 위치에 도달하면 완료되는 퍼즐 옮기기를 구현해보자.

  • 퍼즐오브젝트에 넣기
  • 퍼즐이 최종적으로 위치해야 할 목적지 transform 오브젝트 씬에 배치하기
  • 혹은 collisionstay이용하여 딱 끝쪽에 위치하게 해서 닿고 있으면 true반환하기 exit이면 false
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개의 퍼즐이 모이면 사라지는 부분을 구현해봐야겠다.

profile
게임 클라이언트 개발자

0개의 댓글