1 minute read

Physics 오버렙

Collider[] colliders = Physics.OverlapSphere(transform.position, heatRadius);
foreach(Collider collider in colliders)
{
	if(collider.gameObject.TryGetComponent(out Player player))
	{
		player.Condition.Heated(Heat * Time.deltaTime);
	}
}

이렇게 하면 콜라이더 없이도 충돌 확인을 할 수 있다.
이렇게하면 이미 콜라이더가 있는데 더 넓거나 좁거나 다른 범위로 충돌을 또 감지하고 싶을 때 이렇게 감지 해주면 된다.

이걸 Update에 넣고 돌리면 Update마다 충돌을 확인하여 colliders에 넣어주고, 처리해줄 수 있다.
범위에서 벗어나면 자동으로 감지가 안되기에 따로 처리해줄 필요가 없다.

Timeline

시네마틱 컷을 만들 때 쓰이는 유니티 기능으로 track이라는 객체들의 clip이라는 행동 모음들을 나열하여 시네마틱을 진행한다.
스크린샷 2024-06-03 191744
이렇게 타임라인 오브젝트를 만들고, Window - Squencing - Timeline으로 창을 연다.
그 다음 create를 눌러 Timeline을 만들어 담아준다.
스크린샷 2024-06-03 191916
그럼 이렇게 생긴 창으로 되는데, 왼쪽 위에 + 를 눌러 새로운 객체를 추가하여 그 객체의 움직임이나 위치, 소리 변화 등을 만들어준다.
해당 화면은 카메라를 추가하였고 회전을 시키는 중이다.
Animation에 넣었는데, 넣으려면 객체가 Animator를 빈 상태라로라도 들고 있어야한다.
문제는 여기에 물체 행동, 이동, 회전 변화, 물체 끄고 켜기 등만 할 수 있다는 것이다.
그래서 다양한 기능을 넣고 싶으면 custom으로 만들어줘야한다.
그럴라면 우선 스크립트들을 만들어줘야한다.

[TrackBindingType(typeof(TextMeshProUGUI))]
[TrackClipType(typeof(SubtitleClip))]
public class SubtitleTrack : TrackAsset
{

}

이건 트랙이다. 여기에 Clip이랑 내용물인 TMP를 달아준다.

public class SubtitleClip : PlayableAsset
{
	public string SubtitleText;

	public override Playable CreatePlayable(PlayableGraph graph, GameObject owner)
	{
		var playable = ScriptPlayable<SubtitleBehaviour>.Create(graph);

		SubtitleBehaviour subtitleBehaviour = playable.GetBehaviour();
		subtitleBehaviour.subtitleText = SubtitleText;

		return playable;
	}
}

이건 클립이다. 이걸로 text의 변화를 각각 만든다.

public class SubtitleBehaviour : PlayableBehaviour
{
	public string subtitleText;
	public override void ProcessFrame(Playable playable, FrameData info, object playerData)
	{
		TextMeshProUGUI text = playerData as TextMeshProUGUI;
		text.text = subtitleText;
		text.color = new Color(1, 1, 1, info.weight);
	}
}

이건 Behaviour로 클립의 행동양식을 정한다.

public class SubtitleTrackMixer : PlayableBehaviour
{
	public override void ProcessFrame(Playable playable, FrameData info, object playerData)
	{
		TextMeshProUGUI text = playerData as TextMeshProUGUI;
		string currentText = "";
		float currentAlpha = 0f;

		if(!text) { return; }

		int inputCount = playable.GetInputCount();
		for(int i = 0; i < inputCount; i++)
		{
			float inputWeight = playable.GetInputWeight(i);

			if(inputWeight > 0f )
			{
				ScriptPlayable<SubtitleBehaviour> inputPlayalbe = (ScriptPlayable<SubtitleBehaviour>)playable.GetInput(i);

				SubtitleBehaviour input = inputPlayalbe.GetBehaviour();
				currentText = input.subtitleText;
				currentAlpha = inputWeight;
			}
		}

		text.text = currentText;
		text.color = new Color(1, 1, 1, currentAlpha);
	}
}

이걸 만들고,

public class SubtitleTrack : TrackAsset
{
	public override Playable CreateTrackMixer(PlayableGraph graph, GameObject go, int inputCount)
	{
		return ScriptPlayable<SubtitleTrackMixer>.Create(graph, inputCount);
	}
}

이렇게 해주면 클립이 없을 때는 빈칸이 된다.