๐Ÿš…Unity Cinemachine Dolly Cart๋ฅผ ์ด์šฉํ•ด ๊ธฐ์ฐจ ๊ตฌํ˜„

Se0ng_1lยท2022๋…„ 10์›” 12์ผ
0

์ผ์ƒ Unity

๋ชฉ๋ก ๋ณด๊ธฐ
7/9
post-thumbnail

๐Ÿš…๊ธฐ์ฐจ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์›ํ•˜๋Š” ๋ชฉ์ ์ง€์— ๋„์ฐฉํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด๋ณด์ž

๊ธฐ์ฐจ ๋ ˆ์ผ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด์ „ ๊ธ€ https://velog.io/@5p2rs5/Unity-Cinemachine๊ธฐ๋Šฅ์„-์‚ฌ์šฉํ•ด-ํŠธ๋ž™์„-๋”ฐ๋ผ-์›€์ง์ด๋Š”-์˜ค๋ธŒ์ ํŠธ๋ฅผ-๋งŒ๋“ค์–ด๋ณด์ž-Cinemachine-Dolly-Cart

๋ฏธ๋ฆฌ๋ณด๊ธฐ

๐Ÿ“Œ์‹œ์ž‘

๋‚˜๋Š” ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๊ธฐ์ฐจ์—ญ์„ ๊ตฌํ˜„ํ•ด์•˜๋‹ค.

1. ๊ธฐ์ฐจ : ๋นจ๊ฐ„์ƒ‰, ํŒŒ๋ž€์ƒ‰, ์ดˆ๋ก์ƒ‰ ํ๋ธŒ
(Dolly Cart ์Šคํฌ๋ฆฝํŠธ์˜ position๊ฐ’(์ดˆ๋ก์ƒ‰ ์ฐฝ)์„ ์กฐ์ •ํ•˜์—ฌ ๊ธฐ์ฐจ์ฒ˜๋Ÿผ ๋ฐฐ์น˜ํ•˜๊ธฐ)
2. ์ •๊ฑฐ์žฅ : ๋ณด๋ผ์ƒ‰ ํ๋ธŒ

์‹คํ–‰ ๋ฐ ๋ฌธ์ œ์  1


๐Ÿ˜ฑ๋ฌธ์ œ์ 
์ •๊ฑฐ์žฅ์—์„œ ๋ชจ๋“  ํ๋ธŒ๊ฐ€ ํ•œ ์ง€์ ์— ๊ฒน์น˜๊ฒŒ ๋ฐฐ์น˜๊ฐ€ ๋œ๋‹ค.

ํ•ด๊ฒฐโ“

๐Ÿค”๊ฒน์น˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์กด ํ๋ธŒ๋“ค์˜ Dolly Cart ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—†์• ๊ณ  Train์ด๋ž€ ์ด๋ฆ„์˜ ๋นˆ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด Dolly Cart ์Šคํฌ๋ฆฝํŠธ๋ฅผ Train์˜ค๋ธŒ์ ํŠธ์— ๋„ฃ์–ด ๊ธฐ์ฐจ์ฒ˜๋Ÿผ ๋ฐฐ์น˜ํ•ด๋ณด์ž


์‹คํ–‰ ๋ฐ ๋ฌธ์ œ์  2

(๋ฌธ์ œ์ ์„ ํฌ๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์„ ์ฃผ์—ˆ๋‹ค.)


๐Ÿ˜ฑ๋ฌธ์ œ์ 
๊ฒน์น˜๋Š” ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ,
1. ๊ธฐ์ฐจ๊ฐ€ ๋ ˆ์ผ ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚˜๋Š” ๋ฌธ์ œ
2. ๊ธฐ์ฐจ์˜ ๊ด€์„ฑ๋“œ๋ฆฌํ”„ํŠธ

ํ•ด๊ฒฐโ—๏ธ

1. ์šฐ์„  ์ฒ˜์Œ ๊ธฐ์ฐจ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ Train์˜ค๋ธŒ์ ํŠธ์—์„œ Train 1, 2, 3์„ ๊บผ๋‚ด๊ณ  Dolly Cart ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์‹œ ๋„ฃ์ž.

2. TrainStop์ด๋ž€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

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๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋ฆฌ๊ฑฐ ์ธ์‹์ด ์ •์ƒ์ ์œผ๋กœ ์•ˆ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์„œ ์œ„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

3. ์ž‘์„ฑํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์„ ๋‘์˜ ์˜ค๋ธŒ์ ํŠธ์— ํ• ๋‹นํ•˜๊ณ  ์‚ฌ์ง„์ฒ˜๋Ÿผ ์•Œ๋งž๊ฒŒ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. ๊ธฐ์ฐจ ์ˆœ์„œ์— ๋งž๊ฒŒ Trains์— ๋„ฃ์–ด์ค€๋‹ค.

์ตœ์ข… ๊ฒฐ๊ณผ

๊นƒํ—ˆ๋ธŒ : https://github.com/5P2RS5/ReadyForProject/tree/main/Train

profile
์น˜ํƒ€๊ฐ€ ๋˜๊ณ  ์‹ถ์€ ์ทจ์ค€์ƒ

0๊ฐœ์˜ ๋Œ“๊ธ€