๊ธฐ์ฐจ ๋ ์ผ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ด์ ๊ธ https://velog.io/@5p2rs5/Unity-Cinemachine๊ธฐ๋ฅ์-์ฌ์ฉํด-ํธ๋์-๋ฐ๋ผ-์์ง์ด๋-์ค๋ธ์ ํธ๋ฅผ-๋ง๋ค์ด๋ณด์-Cinemachine-Dolly-Cart
๋๋ ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ๊ธฐ์ฐจ์ญ์ ๊ตฌํํด์๋ค.
1. ๊ธฐ์ฐจ : ๋นจ๊ฐ์, ํ๋์, ์ด๋ก์ ํ๋ธ
(Dolly Cart ์คํฌ๋ฆฝํธ์ position๊ฐ(์ด๋ก์ ์ฐฝ)์ ์กฐ์ ํ์ฌ ๊ธฐ์ฐจ์ฒ๋ผ ๋ฐฐ์นํ๊ธฐ)
2. ์ ๊ฑฐ์ฅ : ๋ณด๋ผ์ ํ๋ธ
๐ฑ๋ฌธ์ ์
์ ๊ฑฐ์ฅ์์ ๋ชจ๋ ํ๋ธ๊ฐ ํ ์ง์ ์ ๊ฒน์น๊ฒ ๋ฐฐ์น๊ฐ ๋๋ค.
(๋ฌธ์ ์ ์ ํฌ๊ฒ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ฝ๊ฐ์ ๋ณ๊ฒฝ์ ์ฃผ์๋ค.)
๐ฑ๋ฌธ์ ์
๊ฒน์น๋ ๋ฌธ์ ๋ ํด๊ฒฐํ์ง๋ง,
1. ๊ธฐ์ฐจ๊ฐ ๋ ์ผ ๋ฐ์ผ๋ก ๋ฒ์ด๋๋ ๋ฌธ์
2. ๊ธฐ์ฐจ์ ๊ด์ฑ๋๋ฆฌํํธ
using System.Collections;
using System.Collections.Generic;
using Cinemachine;
using UnityEngine;
public class TrainStop : MonoBehaviour
{
[SerializeField] GameObject[] trains; // ๊ธฐ์ฐจ ์ค๋ธ์ ํธ๋ค
[SerializeField] GameObject railWay; // ๊ธฐ์ฐจ ๋ ์ผ ์ค๋ธ์ ํธ
public float trainOperatingTime; // ์์ ๊ธฐ์ฐจ ์๋ ์๊ฐ
private float speed; // ๊ธฐ์ฐจ ์๋
private float length; // ๋ ์ผ์ ๊ธธ์ด
private float currentTime; // ํ์ฌ ๊ฒฝ๊ณผ ์๊ฐ
private void Start()
{
length = railWay.GetComponent<CinemachinePath>().PathLength;
// ๋ ์ผ(Dolly track)์ ๊ธธ์ด ๊ฐ์ ธ์ค๊ธฐ
speed = trains[0].GetComponent<CinemachineDollyCart>().m_Speed;
// ๊ธฐ์ฐจ(Cart) ์๋ ๊ฐ์ ธ์ค๊ธฐ
trainOperatingTime = (length - trains[0].GetComponent<CinemachineDollyCart>().m_Position) / speed;
// ์๊ฐ = ๊ฑฐ๋ฆฌ / ์๊ฐ
currentTime = 0f;
}
private void Update()
{
if (currentTime >= trainOperatingTime)
{
ScriptOff();
}
else
{
currentTime += Time.deltaTime;
}
}
public void ScriptOff() // ๊ธฐ์ฐจ ๋ฉ์ถ๊ฒ ํ๊ธฐ
{
for (int i = 0; i < trains.Length; i++)
{
trains[i].GetComponent<CinemachineDollyCart>().enabled = false;
}
}
}
โญ๏ธํต์ฌ
์๋ ๊ณต์
v = d/t
์๊ฐ ๊ณต์
t = d / v
(v = ์๋, d = ๊ธธ์ด, t = ์๊ฐ)
์ฐ๋ฆฌ๋ CinemachinePath ์คํฌ๋ฆฝํธ์์ ๋ ์ผ์ ๊ธธ์ด๋ฅผ ์ ์ ์๊ณ CinemachineDollyCart ์คํฌ๋ฆฝํธ์์ ๊ธฐ์ฐจ์ ์๋๋ฅผ ๊ตฌํ ์ ์๋ค.
์ด๋ฅผ ์ด์ฉํด ๊ธฐ์ฐจ๊ฐ ์ ๊ฑฐ์ฅ์ ๋์ฐฉํ ์๊ฐ์ ์์ํด๋ณด์trainOperatingTime = (length - trains[0].GetComponent().m_Position) / speed;
length = ๋ ์ผ์ ์ ์ฒด ๊ธธ์ด : 1๏ธโฃ
trains[0].GetComponent().m_Position = ์ ๋์ ๊ธฐ์ฐจ ์ค๋ธ์ ํธ์ ์์น : 2๏ธโฃ
๊ฐ์ฅ ์ ๋์ ๊ธฐ์ฐจ ์ค๋ธ์ ํธ์ ์ ๊ฑฐ์ฅ ์ฌ์ด์ ๊ฑฐ๋ฆฌ : 1๏ธโฃ - 2๏ธโฃ = 3๏ธโฃ
speed = ๊ธฐ์ฐจ์ ์๋ : 4๏ธโฃ
trainOperatingTime = ์๋ ์์ ์๊ฐ : 3๏ธโฃ / 4๏ธโฃ = 5๏ธโฃ
currentTime += Time.deltaTime;
์ฝ๋๋ฅผ ํตํด ์๊ฐ์ ํ์ธํ์ฌ ๋ง์ฝ ์์ ๋์ฐฉ์๊ฐ๋ณด๋ค ์ปค์ง๋ฉด ScriptOff()ํจ์๋ก ์คํฌ๋ฆฝํธ๋ฅผ ๊บผ์ ๊ธฐ์ฐจ๋ฅผ ๋ฉ์ถ๊ฒ ํ๋ฉด ๋๋ค.
ย๐ค Why (๊ทธ๋ฐ๋ฐ ์?)
Q: OnTrigger๋ฅผ ์ฌ์ฉํด์ ์ ๊ฑฐ์ฅ์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ง๋ค์ด์ ๊ธฐ์ฐจ์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ์์์ผ ๋ฉ์ถ๊ฒ ํ๋ฉด ์ฌ์ธ๊ฒ ๊ฐ์๋ฐ ์ ์๊ฐ์ ์ฌ์ฉํ๊ฑด๊ฐ์?
A: ์๋ค๋จธ์ ๊ด๋ จ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐพ์๋ณด๋ฉด Dolly Track์ ์ค๋ธ์ ํธ๋ฅผ position๊ฐ์ ๋ณ๊ฒฝ์ํค๋ ๋ฐฉ๋ฒ์ผ๋ก ์ค๋ธ์ ํธ๋ฅผ ์ด๋์ํต๋๋ค.
position๊ฐ์ ๋ณ๊ฒฝ์ํค๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌ๊ฑฐ ์ธ์์ด ์ ์์ ์ผ๋ก ์๋๋ ๋ฌธ์ ๊ฐ ์๊ฒจ์ ์์ ๋ฐฉ๋ฒ์ผ๋ก ๋ง๋ค์์ต๋๋ค.
๊นํ๋ธ : https://github.com/5P2RS5/ReadyForProject/tree/main/Train