내일배움캠프 34일차 6/03 TIL + Unity공부
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이라는 행동 모음들을 나열하여 시네마틱을 진행한다.
이렇게 타임라인 오브젝트를 만들고, Window - Squencing - Timeline으로 창을 연다.
그 다음 create를 눌러 Timeline을 만들어 담아준다.
그럼 이렇게 생긴 창으로 되는데, 왼쪽 위에 + 를 눌러 새로운 객체를 추가하여 그 객체의 움직임이나 위치, 소리 변화 등을 만들어준다.
해당 화면은 카메라를 추가하였고 회전을 시키는 중이다.
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);
}
}
이렇게 해주면 클립이 없을 때는 빈칸이 된다.