티스토리 뷰

반응형

오늘도 참 열심히 했다. 30분만에 끝날 줄 알았는데 2시간이나 걸렸다. 아주 간단한 코드인데도 막혔고, 방법을 찾는데 아직 시간이 좀 걸리는 것 같다. 그리고 컴퓨터가 왜.. 이거 만드는데 느려지는지 모르겠다.

 

Gamelog 24. 미로찾기 게임 만들기(3)

Gamelog 24_1. 열쇠 배치하기

유니티 열쇠 만들기

이번에는 열쇠를 다 먹어야 보물상자를 먹고 종료할 수 있도록 할 것이다.

열쇠는 회색 열쇠가 상단에 나타나고 먹으면 노란색으로 활성화되는 방식이다.

유니티 미로 만들기

열쇠 3개를 미로 내에 배치해준다.

유니티 그룹화

그리고 이 열쇠는 Empty Object를 생성하여 keys로 묶어줬다.
이름도 target_key로 알기 쉽게 변경하였다.

유니티 오브젝트 빛 설정방법

keys의 Z값은 10이고,

유니티 오브젝트 빛설정

target_key들의 Scale Z값은 1이다.
Z값을 잘 설정해야 오브젝트가 빛 설정을 잘 받는다. 아니면 꺼매지거나 하얗게 된다.
Material도 Default-Diffuse로 설정하여 빛을 받는 재질로 변경시킨다.

 

Gamelog 24_1. 점수 열쇠 만들기

유니티 오브젝트 활성화 전환하기

미로 상단에 회색 열쇠와 노란색 열쇠를 같은 위치에 겹쳐놔준다.

유니티 컴포넌트 내용 복사하기

이때는 Transform > Copy > Component에서 복사를 하면 좀 더 편하게 위치를 설정할 수 있다.

유니티 레이어 설정

그리고 회색키는 뒤에 배치될 수 있도록 Order in Layer를 0으로,

유니티 레이어

노란키는 앞에 배치될 수 있도록 Order in Layer를 1로 설정한다.

유니티 오브젝트 부딪히게 하기

이제 열쇠를 먹으면 회색 열쇠가 노란색으로 바뀌게 해본다.
미로 안의 노란색 열쇠에 Box Collider 2D를 모두 설정한다.

유니티 오브젝트 설정

그리고 개구리 캐릭터에 On Collision\_Show 스크립트를 추가하여 준다.
열쇠는 하나씩 매핑한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 충돌하면 표시한다 
public class OnCollision_Show : MonoBehaviour
{

    public string targetObjectName; // 목표 오브젝트 이름 : Inspector에 지정
    public string showObjectName;   // 표시 오브젝트 이름 : Inspector에 지정

    GameObject showObject;

    void Start()// 처음에 시행한다 
    { 
        // 지우기 전에 표시 오브젝트를 기억해 둔다 
        showObject = GameObject.Find(showObjectName);
        showObject.SetActive(false); // 지운다
    }

    void OnCollisionEnter2D(Collision2D collision)// 충돌했을 때
    { 
        // 만약 충돌한 것의 이르이 목표 오브젝트면 
        if (collision.gameObject.name == targetObjectName)
        {
            showObject.SetActive(true); // 지웠던 것을 표시한다 
        }
    }
}

유니티 오브젝트 표시하기

그러면 일단 열쇠에 닿으면, 회색 열쇠가 활성화되도록 완료되었다.

유니티 오브젝트 숨기기

이제 열쇠에 닿으면 열쇠가 숨겨지도록 On Collision\_Hide 스크립트를 세팅해준다.
이것도 나는 개구리에 다 넣어줬다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 충돌하면 지운다
public class OnCollision_Hide : MonoBehaviour
{

    public string targetObjectName; // 목표 오브젝트 이름 :Inspector에 지정
    public string hideObjectName;   // 지울 오브젝트 이름 :Inspector에 지정

    void Start()
    { // 처음은 아무 것도 하지 않는다
    }

    void OnCollisionEnter2D(Collision2D collision)
    { // 충돌했을 때
      // 만약 충돌한 것의 이름이 목표 오브젝트였다면
        if (collision.gameObject.name == targetObjectName)
        {
            // 지울 오브젝트를 찾아서
            GameObject hideObject = GameObject.Find(hideObjectName);
            hideObject.SetActive(false); // 지운다
        }
    }
}

유니티 오브젝트 활성화 전환

그리고 노란색 키들을 묶어놓은 yes_keys에 Show\_Meet Condition 스크립트를 추가한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Show_MeetCondition : MonoBehaviour
{
    public string showObjectName; // 표시할 오브젝트 이름
    public string targetObjectName1;
    public string targetObjectName2;
    public string targetObjectName3;

    GameObject showObject;

    void Start()
    {
        // 지우기 전에 표시 오브젝트를 기억해 둔다 
        showObject = GameObject.Find(showObjectName);
        showObject.SetActive(false); // 지운다
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        if (GetActiveState(targetObjectName1) == true) {
            if (GetActiveState(targetObjectName2) == true) {
                if (GetActiveState(targetObjectName3) == true) {
                    showObject.SetActive(true);
                }
            }
        }
    }

    bool GetActiveState(string targetObjectName) {
        GameObject targetObject = GameObject.Find(targetObjectName);

        if (targetObject) return true;
        else return false;

    }
}

이 스크립트는 열쇠들이 모두 활성화되면, showObject를 보여주도록 하는 스크립트이다.

    bool GetActiveState(string targetObjectName) {
        GameObject targetObject = GameObject.Find(targetObjectName);

        if (targetObject) return true;
        else return false;

    }

이때, NullReferenceException에러가 발생하는 것을 방지하기 위해
null 체크 로직을 사용하여 한번에 노란색 열쇠로 활성화 되었는지와 에러방지도 한다.

유니티 게임 클리어 구현

이제 마지막으로, 보물상자를 먹을 경우 게임 클리어가 나타날 수 있도록 스크립트를 추가해주면 완료!

유니티 미로찾기 게임만들기

반응형
댓글