설치 오브젝트 미리보기 이미지
설치 UI에서 이미지를 만들어 준다.

Preview를 만들었던 방법과 동일한 방식으로 구현했다. (Render Texture, Raw Image)

중요한 점은 배경색이 나오지 않게 하기 위해 렌더링 카메라의 배경 타입을 단색으로 하고, 알파값을 0으로 맞췄다.

맵 디자인
맵의 색을 적 레벨과 스테이지별로 다르게 할 것이다.
맵의 색이 변할 떄는 자연스럽게 RGB값을 조절해서 자연스러운 색 변화를 만들것이다.
MapVisual
맵의 색을 변경시켜주는 스크립트이다.
using System.Collections;
using UnityEngine;
public class MapVisual : MonoBehaviour
{
[SerializeField] Renderer[] changeMap; // 색이 바뀌는 맵 오브젝트
[SerializeField] Material[] mapMaterials; // 맵의 색 0,1 : Easy / 2,3 : Normal / 4,5 : Hard / 6 : Boss
private Coroutine[] changeCoroutine;
Material currentMaterial;
private void Awake()
{
changeCoroutine = new Coroutine[changeMap.Length];
}
private void Start()
{
GameManager.Instance.changeMaterial += ChangeMapColor;
GameManager.Instance.gameInit += ChangeMapColor;
ChangeMapColor();
}
private void OnDisable()
{
GameManager.Instance.changeMaterial -= ChangeMapColor;
GameManager.Instance.gameInit -= ChangeMapColor;
}
void ChangeMapColor() // 맵 공간의 색을 변화시킨다.
{
FindMaterial();
for(int i = 0; i < changeMap.Length; i++)
{
if(changeCoroutine[i] != null)
{
StopCoroutine(changeCoroutine[i]);
}
changeCoroutine[i] = StartCoroutine(ChangeColor(currentMaterial, changeMap[i],i));
}
Debug.Log("바꿔");
}
}
변수에는 색이 바뀌어야 하는 Render를 가지고 있는 오브젝트 배열과, 변경될 색이 들어있는 Material 배열이 존재한다.
ChangeMapColor 함수는 맵의 색이 변경되어야 할때, 호출된다.
이 함수는 색을 변화시켜야 하는 오브젝트들을 하나씩 매개변수로 사용해서 변화시킨다.
GameManager의 changeMaterial 델리게이트는 전에 큐브 색을 변화시키는 화면(레벨 조절화면)에서 적 큐브색과 함께 맵의 색이 변하도록 구독했으며, gameInit는 게임이 초기화 될때, 즉 스테이지 레벨이 변했을 때 호출되게끔 구독했다.
Map Visual 기능 코드
이 함수도 Map Visual에 존재한다.
void FindMaterial() // 사용할 Material을 넣는 함수
{
int level = GameManager.Instance.enemyLevel;
int stage = GameManager.Instance.enemyStage;
if(stage == 5)
{
currentMaterial = mapMaterials[6];
return;
}
int id = (level - 1) * 2 + (stage > 2 ? 1 : 0);
if(id >= 0 && id <= mapMaterials.Length)
{
currentMaterial = mapMaterials[id];
}
}
IEnumerator ChangeColor(Material targetMat, Renderer render, int index)
{
Material instanceMat = render.material;
Color startColor = instanceMat.color;
Color endColor = targetMat.color;
Camera mainCam = Camera.main;
instanceMat.shader = targetMat.shader;
float duration = 1.5f;
float t = 0;
while (t < duration)
{
t += Time.deltaTime;
float per = t / duration;
instanceMat.color = Color.Lerp(startColor, endColor, per);
mainCam.backgroundColor = instanceMat.color;
yield return null;
}
instanceMat.color = endColor;
changeCoroutine[index] = null;
}
FindMaterial의 경우, 변경되어야 하는 색을 찾는 함수이다. 적의 레벨과 스테이지를 통해서 바뀌어야 하는 색을 찾고, currentMaterial에 저장한다.
ChangeColor 코루틴 함수의 경우 변경되어야 하는 오브젝트(Render)를 가지고, 처음 색과 바뀌어야 하는 색을 가지고 Color.Lerp를 통해서 t,duration을 활용하여 시간내에 자연스럽게 색이 변화 하도록 한다.
이때, Material들이 동일한 셰이더를 가지고 있지 않기때문에, 바뀌어야 하는 Material의 셰이더로 변경한다.
추가로 카메라의 배경색 또한 변경시켜서 Orthographic 화면의 단점을 가린다. (화면 일부분이 벽이 아닌 Skybox를 렌더링)
여기서 사용한 기술을 코루틴 함수를 코루틴을 실행하는 횟수(오브젝트)만큼 Awake에서 만들고, 코루틴을 실행할 때, 만들어진 코루틴에 순차적으로 넣어준다. 이렇게 하면 코루틴이 작동중일 때, 모든 코루틴을 검사하기 수월해 작동중 중단 이후 재작동이 된다.
매개변수로 index를 넣은 이유와 changeCorutine[index]를 null로 만든 이유이다.

버그 수정
게임 클리어시 작동 수정 (버그)
게임 클리어시, 적 레벨과 스테이지가 초기화 되지 않아서 메인 화면에서 계속 배경 색이 남아있는 것을 확인했다.
GameManager
public void MainScene()
{
enemyLevel = 1;
enemyStage = 1;
reGame?.Invoke();
gameInit?.Invoke();
myState = GameState.STANDBY;
winner = Winner.NONE;
enemyStage = 1;
mainScene?.Invoke();
Time.timeScale = 1f;
}
MainScene 함수가 실행될 때, 레벨과 스테이지가 1로 되도록 코드를 추가했다.

카메라 타겟 오류
카메라가 타겟을 쫓아가고 마지막에 target의 위치 + offset을 할 때 target이 사라지면 오류가 난다.
IEnumerator IChangeTarget()
{
isMoving = true;
float t = 0;
Vector3 start = controllCam.transform.position;
Vector3 end = target.position + offset;
while(t <= 1)
{
controllCam.transform.position = Vector3.Lerp(start,end,t);
t += Time.deltaTime * cameraMoveSpeed;
yield return null;
}
if(target != null)
{
controllCam.transform.position = target.position + offset;
}
isMoving = false;
yield return null;
}
if문으로 target을 검사후에 target의 위치를 사용하는 것으로 수정했다.
'GameDev > Cubidom' 카테고리의 다른 글
| Cubidom - FTUE 만들기 2 (0) | 2026.04.27 |
|---|---|
| Cubidom - FTUE 만들기 1 (0) | 2026.04.26 |
| Cubidom - SFX 넣기 2 (0) | 2026.04.22 |
| Cubidom - SFX 넣기 1 (0) | 2026.04.20 |
| Cubidom - BGM 넣기 (0) | 2026.04.18 |