목표
랜덤으로 일반, 이동, 사라지는 플렛폼을 배치하여 재미요소를 추가하겠습니다.
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에서도 할 수 있지만 스크립트 코드로도 적용가능합니다.
현재까지 생성된 스크립트 파일들입니다.
현재 씬을 구성하고 있는 오브젝트들 입니다.
다음화는 스테이지를 구성하고 스테이지 정보에 따라 플렛폼 속성을 변경하는 코드를 작성해 보겠습니다.
'Programming > 유니티' 카테고리의 다른 글
유니티 (Unity) - Button의 OnClick Listener 사용법 (0) | 2024.02.23 |
---|---|
유니티 (Unity) Rigidbody2d velocity 활용법 (0) | 2024.02.20 |
유니티 (Unity Basic) 이미지 적용 (Image Drag and Drop) (0) | 2024.02.16 |
유니티 (Unity Basic) 프리팹 만들기 (Create Prefab) (0) | 2024.02.16 |
유니티 (Unity Basic) 오브젝트 만들기 (Create Object) (0) | 2024.02.16 |