본문 바로가기

Programming/유니티

유니티(Unity) 프로젝트 점프게임 만들기 : [7] 플렛폼 생성

목표

랜덤으로 일반, 이동, 사라지는 플렛폼을 배치하여 재미요소를 추가하겠습니다.

PlatformSpot

'PlatformManager'에서 플렛폼을 생성하는 부분을 수정합니다. 우선 수정할 내용에 들어갈 스크립트를 작성합니다.

----

----

PlatformSpot.cs

PlatformSpot 은 플렛폼 타입에 따라서 프리팹을 로드해서 플랫폼을 만듭니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlatformSpot : MonoBehaviour
{
    int platformIndex = 0;
    Platform curShowingPlatform = null;

    public void SetPlatformIndex(int _index)
    {
        platformIndex = _index;
    }
    public int GetPlatformIndex { get { return platformIndex; } }

    public void SetPlatformType (PLATFORM_TYPE _type)
    {
        //현재 보여지는 플렛폼과 같은 속성이라면 리턴
        if (curShowingPlatform != null)
        {
            if (curShowingPlatform.GetPlatformType == _type)
            {
                return;
            }
            Destroy(curShowingPlatform.gameObject);
            curShowingPlatform = null;
        }

        Object _prefab = null; 
        switch (_type)
        {
            case PLATFORM_TYPE.HIDE: _prefab = Resources.Load("PlatformHide"); break;
            case PLATFORM_TYPE.MOVE: _prefab = Resources.Load("PlatformMove"); break;
            default: _prefab = Resources.Load("PlatformNormal"); break;
        }

        var _go = Instantiate(_prefab, transform) as GameObject;
        curShowingPlatform = _go.GetComponent<Platform>();

        _go.transform.localPosition = Vector3.zero;
        _go.transform.localScale = Vector3.one;
    }
}

중요부분은 다음 부분입니다. 플렛폼 타입에 맞춰 'PlatformHide', 'PlatformMove', 'PlatformNormal'을 로드하여 생성합니다.

public void SetPlatformType (PLATFORM_TYPE _type)
{
    //현재 보여지는 플렛폼과 같은 속성이라면 리턴
    if (curShowingPlatform != null)
    {
        if (curShowingPlatform.GetPlatformType == _type)
        {
            return;
        }
        Destroy(curShowingPlatform.gameObject);
        curShowingPlatform = null;
    }

    Object _prefab = null; 
    switch (_type)
    {
        case PLATFORM_TYPE.HIDE: _prefab = Resources.Load("PlatformHide"); break;
        case PLATFORM_TYPE.MOVE: _prefab = Resources.Load("PlatformMove"); break;
        default: _prefab = Resources.Load("PlatformNormal"); break;
    }

    var _go = Instantiate(_prefab, transform) as GameObject;
    curShowingPlatform = _go.GetComponent<Platform>();

    _go.transform.localPosition = Vector3.zero;
    _go.transform.localScale = Vector3.one;
}

중간에 다른 플렛폼으로 변경되더라도 적용되도록 현재 플렛폼을 저장했다가 새로운 플렛폼을 생성하고 기존의 플렛폼'curShowingPlatform' 을 제거합니다.

이제 'PlatformManager.cs'에서 플렛폼을 만드는 부분을 PlatformSpot을 적용하는 것으로 수정해줍니다.

PlatformManager.cs

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

public class PlatformManager : MonoBehaviour
{
    //!! 변경된 부분
    List<PlatformSpot> platforms = new List<PlatformSpot>();
    
    ....

    public void MakePlatforms(float _startPos, float _distance)
    {
        //카메라 영역의 크기를 가져온다 
        var _orthoSize = Camera.main.orthographicSize;

        //발판이 시작되는 위치부터 화면의 영역에 들어갈 발판의 갯수를 구한다
        var _screenHeight = (_orthoSize * 2) - _startPos;
        var _divideCount = (int)(_screenHeight / _distance);

        //화면에 보여질 발판외에 상단에 미리 생성해 놓을 발판의 갯수를 추가하여
        //캐릭터 기준으로 위로 몇개의 발판이 놓일지 정한다.
        preloadUpCount = _divideCount + preloadCount;

        //발판이 시작될 위치를 계산한다
        platformStartPosition = -_orthoSize + _startPos;
        //발판 사이의 거리를 지정한다
        platformDistance = _distance;

        Debug.Log("PreloadCount " + preloadUpCount);

        transform.position = Vector3.up * -_orthoSize;

        //만들어질 발판의 갯수를 정한다
        var _loopCount = preloadUpCount + preloadDownCount;
        var _platFormStartPos = _startPos - (_distance * preloadCount);

        Debug.Log("_loopCount : " + _loopCount);

        //!! 변경된 부분
        MakePlatform(_loopCount, _platFormStartPos, _distance);


        //아래로 다섯개가 생기기 때문에 현재 위치는 5번째가 된다.
        curPlatformIndex = preloadDownCount;
    }
    
    ....
    
    //!! 변경되어 추가된 부분
    void MakePlatform(int _loopCount, float _platFormStartPos, float _distance)
    {
        for (int i = 0; i < _loopCount; i++)
        {
            var _go = new GameObject();
            var _spot = _go.AddComponent<PlatformSpot>();
            var _ypos = _platFormStartPos + (_distance * i);
            _go.transform.SetParent(transform);
            _go.transform.localScale = Vector3.one;
            _go.transform.localPosition = Vector3.up * _ypos;

            var _platformType = Random.Range(0, (int)PLATFORM_TYPE.HIDE + 1);

            //발판의 순서를 정해준다
            _spot.SetPlatformIndex(i);
            _spot.SetPlatformType((PLATFORM_TYPE)_platformType);

            platforms.Add(_spot);
        }
    }
}

초기에 만들어질 발판에 PlatformSpot.cs 를 AddComponent 로 추가합니다. Add Component는 Inspector에서도 할 수 있지만 스크립트 코드로도 적용가능합니다.

unity scripts

현재까지 생성된 스크립트 파일들입니다. 

unity Hierarchy

현재 씬을 구성하고 있는 오브젝트들 입니다.

다음화는 스테이지를 구성하고 스테이지 정보에 따라 플렛폼 속성을 변경하는 코드를 작성해 보겠습니다.