최종프로젝트 5일차
현재 메인 퍼즐의 기믹은 한쪽 플레이어에서만 보이는 문양에 해당하는 석상을 찾아 5개의 석상을 전부 활성화시키는 것을 목표로 한다.
public class MainPuzzle : MonoBehaviour
{
[Header("StatueInfo")]
[SerializeField] public GameObject statuesContainer; //석상들을 자식오브젝트로 두는 게임오브젝트
[SerializeField] private Statue[] statues = new Statue[5]; //석상 5개 고정이므로 배열로 처리
[field : SerializeField] public Statue curStatue { get; private set; } = null; //현재 상호작용해야하는 석상
private void OnEnable()
{
for(int i = 0; i < statuesContainer.transform.childCount; i++)
{
Statue newStatue = statuesContainer.transform.GetChild(i).AddComponent<Statue>();
newStatue.SetAdress(this);
newStatue.DeActivate();
statues[i] = newStatue;
}
}
private void Start()
{
UpdateStatueList(); //기본 세팅이 완료되었다면 로직 시작
}
private void UpdateStatueList() //상호작용해야하는 석상을 다시 정하는 메서드
{
if (curStatue != null) return; //아래 구문은 curState가 비어있는 상태서만 작동하게 함 따라서 상호작용한 이후엔 curState를 비워둘 예정)
List<Statue> inactiveStatues = new List<Statue>(); //비활성화되어 있는 석상을 넣어줄 리스트
foreach (Statue statue in statues)
{
if (!statue.isActivate)
inactiveStatues.Add(statue);
}
if(inactiveStatues.Count > 0) //활성화될 오브젝트가 남아있다면
{
int random = Random.Range(0, inactiveStatues.Count);
curStatue = inactiveStatues[random];
}
else
{
ClearPuzzle();
}
}
public void MatchPuzzle()
{
curStatue.Activate();
curStatue = null;
UpdateStatueList(); //다음 로직 시작
}
public void ResetPuzzle() //잘못된 선택시 사용되는 메서드
{
foreach (Statue statue in statues)
{
statue.DeActivate(); //모든 석상 비활성화
}
curStatue = null;
UpdateStatueList(); //퍼즐 다시 시작
}
private void ClearPuzzle() //모든 상호작용에 성공시 사용되는 메서드
{
this.enabled = false; //클리어 후엔 해당 퍼즐을 비활성화할까 생각중 (물론 교수 방 봉인 해제 로직도 생각해두어야함)
}
}
사실 마지막에 플레이어들이 보게되는 끝판왕치곤 이펙트가 약한 게 아닌가 싶어 수정할까 생각중이다.
레벨디자인 같은 경우를 생각해서도 비중이 너무 약한 퍼즐이 아닌가 싶다.
그래서 데스티니2의 오라클 기믹을 모티브삼아 메인퍼즐을 만들고 이 퍼즐 기믹은 다른 곳에 이관할까 생각중이다.
(아니면 다른 요소로 난이도를 대체할 수도 있을 것 같다.)
석상이 활성화되었을 때 빛나는 표현을 해주고 싶어서 기능을 찾다보니
머터리얼의 이미션이라는 옵션에 대해 알게 되었습니다.
사실 공식문서 검색을 통해서 관련 기능을 찾으려니
그래픽스, 랜더링, 텍스쳐 어디서부터 접근해야할지 가늠이 안되어서
튜터님께 질문을 통해 알게된 기능입니다.
Emission 은 빛을 내는 것처럼 보이지만 실제로 빛을 내는 것은 아니라고 합니다.
(실제로 빛 효과를 주고 싶다면 Light 관련 기능)
이미션 옵션은 코드에서 바로 접근이 되는 프로퍼티는 없는 것으로 보입니다.
아래처럼 SetColor 메서드에서 문자열로 기능을 입력하는 데
뭔가 애니메이션처럼 Hash로 변환하는 형식이 아닌가 생각이 듭니다.
매개변수로 인트를 받기도해서 합리적인 추론중 검색을 통해 더 찾아보도록 해야할 것 같습니다.
private void LightOn()
{
Renderer renderer = GetComponent<Renderer>();
Material material = renderer.material;
material.SetColor("_EmissionColor",Color.white);
}
또한 좀 더 사실적인 표현을 위해 블룸이라는 기법을 사용하는 것도 보았는데
URP부터 사용이 가능하며
카메라에서 표현되는 빛을 주변 오브젝트에 새어들어가는 것처럼 보이게 만든다고 합니다.
'TIL' 카테고리의 다른 글
2024 12 02 TIL (0) | 2024.12.02 |
---|---|
2024 12 01 TIL (0) | 2024.12.01 |
2024 11 28 TIL (0) | 2024.11.28 |
2024 11 27 TIL (0) | 2024.11.27 |
2024 11 26 TIL (0) | 2024.11.26 |