씬 내의 던전의 입구에 두개의 오브젝트가 있다. 같은 스크립트 "Fog Switch Trigger"을 사용하여 인스펙터의 값에 따라 다르게 작동하도록 구현하였다. 이 콜라이더는 플레이어의 입장 / 퇴장을 트리거로 체크하여 판단해 안개를 짙게 하거나 맑게 하는 함수를 호출한다.
Enter와 Exit 오브젝트에 있는 Fog Switch Trigger 스크립트에 값이 다른것을 볼 수 있다.
mIsActiveSwitch는 참일때 해당 트리거가 발생하면 안개 짙음을 작동을 시키도록 하고 거짓일때는 안개를 맑게 한다.
mSetFogDist는 mIsActiveSwitch가 참일때 안개를 얼마나 짙게 할지 (안개 거리를 얼마나 가까이 할지) 결정하는 값이다. mIsActiveSwitch가 거짓이면 mSetFogDist의 값은 무시된다.
//FogSwitchTrigger.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FogSwitchTrigger : MonoBehaviour
{
//환경 변수를 제어하는 환경 매니저이다.
private EnviromentMgr mEnvManager;
//해당 트리거가 발생하면 참에 대한 함수를 호출할지 결정하는 bool 변수이다.
[SerializeField] private bool mIsActiveSwitch;
//트리거가 발생하며 mIsActiveSwitch가 참인경우 인자로 넘겨줄 변수이다.
[SerializeField] private float mSetFogDist = -1;
private void Start()
{
mEnvManager = FindObjectOfType<EnviromentMgr>();
}
private void OnTriggerEnter(Collider other)
{
if(other.gameObject.CompareTag("Player"))
{
if(mIsActiveSwitch)
{
mEnvManager.SetFog(mSetFogDist);
}
else
{
mEnvManager.ClearFog();
}
}
}
}
|
cs |
FogSwitchTrigger.cs
- 입장/퇴장에 따른 트리거를 체크하는 스크립트로 트리거가 발생하면 환경 매니저에 안개 설정 관련 함수를 호출한다.
private EnviromentMgr mEnvManager;
- 환경 매니저로 안개 값을 설정하도록 한다.
- 씬에 한개만 존재한다.
[SerializeField] private bool mIsActiveSwitch;
- 트리거가 발생했을 때 이 변수에 따라 참 / 거짓에 따라 호출되는 함수가 서로 다른데, 호출함수를 결정하는 변수이다.
- 인스펙터에서 해당 변수를 설정할 수 있다.
[SerializeField] private float mSetFogDist = -1;
- 트리거가 발생했을 때 mIsActiveSwitch가 참일경우 이 값으로 안개의 거리를 조정하도록 하는 변수이다.
- 인스펙터에서 해당 변수를 설정하여 상황이나 위치에 맞게, 의도에 따라 안개 거리를 다르게 설정한다.
private void Start()
- 씬이 로드되면 씬에 하나 존재하는 환경 매니저를 찾아 mEnvManager에 넣는다.
private void OnTriggerEnter(Collider other)
- Player 태그가 참인 트리거가 발생하면 mIsActiveSwitch의 참/거짓에 따라 호출하는 함수가 다르다.
//EnviromentMgr.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnviromentMgr : MonoBehaviour
{
//씬 로드시 안개의 거리
private float mOriginFogDistance;
//안개가 짙어지거나 맑아질때 변하는 속도
[SerializeField] private float mFogSpeed;
//안개 관련 코루틴을 담는 변수들
private Coroutine mClearFogCoroutine, mRunSetFog;
private void Start()
{
mOriginFogDistance = RenderSettings.fogEndDistance;
}
//안개를 맑게 한다.
public void ClearFog()
{
StopPrevCoroutines();
mClearFogCoroutine = StartCoroutine(RunClearFog());
}
//안개의 거리를 fogDist까지 짙게 한다.
public void SetFog(float fogDist)
{
StopPrevCoroutines();
mRunSetFog = StartCoroutine("RunSetFog", fogDist);
}
//안개가 짙어지거나 맑아지는 도중에 다른 함수가 호출된경우 기존의 코루틴을 제거하고 다시 시작하도록 한다.
private void StopPrevCoroutines()
{
if(mClearFogCoroutine != null) StopCoroutine(mClearFogCoroutine);
if(mRunSetFog != null) StopCoroutine(mRunSetFog);
}
//안개를 서서히 맑게 하는 코루틴
private IEnumerator RunClearFog()
{
while(RenderSettings.fogEndDistance < mOriginFogDistance)
{
RenderSettings.fogEndDistance += mFogSpeed * Time.deltaTime;
yield return null;
}
RenderSettings.fogEndDistance = mOriginFogDistance;
}
//안개를 서서히 짙어지게 하는 코루틴
private IEnumerator RunSetFog(float fogDist)
{
while(RenderSettings.fogEndDistance > fogDist)
{
RenderSettings.fogEndDistance -= mFogSpeed * Time.deltaTime;
yield return null;
}
RenderSettings.fogEndDistance = fogDist;
}
}
|
cs |
EnviromentMgr.cs
- 환경관련 변수들을 제어하는 매니저로 씬에 하나만 존재한다.
- 현재는 안개 관련 기능만 구현되어있다.
private float mOriginFogDistance;
- 씬을 로드할 때 초기의 안개 거리를 담는 변수이다.
- Start()에서 초기화된다.
[SerializeField] private float mFogSpeed;
- 안개가 짙어지거나 맑아지는 속도를 담당하는 변수이다.
- 씬 별로 속도가 다르게 하기위해 인스펙터에서 지정하도록 한다.
private Coroutine mClearFogCoroutine, mRunSetFog;
- 안개를 짙게하거나 맑아지게 하는데 코루틴을 호출하는데, 실행된 코루틴을 담는 변수이다.
- 코루틴이 끝나는데까지 시간이 소요되기에 연속적으로 코루틴이 호출되면 의도하지 않은 결과가 나올 수 있기에 사용한다.
private void Start()
- 씬을 로드할 때 초기의 안개 거리를 mOriginFogDistance에 초기화 시킨다.
public void ClearFog()
- 안개를 맑게 하는 함수이다.
- 기존의 코루틴이 존재하면 제거하고 새로운 코루틴을 호출하고 해당 코루틴을 변수에 담는다.
public void SetFog(float fogDist)
- 안개를 짙게 하는 함수이다.
- 짙은 정도(안개가 가까운 거리)는 fogDist까지하며 RunSetFog() 코루틴에 인자로 넘겨서 호출한다.
- 기존의 코루틴이 존재하면 제거하고 새로운 코루틴을 호출하고 해당 코루틴을 변수에 담는다.
StopPrevCoroutines()
- 기존 코루틴들이 null이 아닌경우(존재하는경우) 해당 코루틴들을 멈춘다(제거한다)
private IEnumerator RunClearFog()
- RenderSettings.fogEndDistance < mOriginFogDistance가 참인동안 fogEndDistance를 mFogSpeed * Time.deltaTime만큼 증가시킨다.
- 증가시킨다는 의미는 안개의 거리를 멀리하게하여 시야를 트이게 한다는 것이다.
private IEnumerator RunSetFog(float fogDist)
- RenderSettings.fogEndDistance > fogDist가 참인동안 fogEndDistance를 mFogSpeed * Time.deltaTime만큼 감소시킨다.
- 감소시킨다는 의미는 안개의 거리를 가까이하여 시야를 탁하게 만드는것이다.
'unity game modules' 카테고리의 다른 글
[유니티] 충돌 연출 및 RigidBody.AddForce()의 이해 (0) | 2022.07.17 |
---|---|
[유니티] 카메라 흔들림 효과 (0) | 2022.07.17 |
[유니티] 3인칭 움직이기 (0) | 2022.07.16 |
[유니티] 공격(스킬) 범위 표시 (0) | 2022.07.16 |
[유니티] 오브젝트 풀 (Object Pool) (0) | 2022.07.16 |