== Intro ==
- use case: 假設一個棋牌游戲的房間,玩家進入房間后處于站立視角,點擊座位后,玩家入座,視角切換,開始游戲
- Mechanism: State-Driven Camera Motion
- 將UI部件根據世界坐標下物件放置到螢屏上對應位置
- 需要進行平滑的相機移動
- 總共有四種視角:Stand Up視角 * 1, Sit Down視角 * 3,
- 根據玩家選擇的不同,鏡頭移動到不同的Sit Down視角
- 點擊Stand Up Btn 后,回到Stand Up視角
- 使用Camera.WorldToScreenPoint
- https://docs.unity3d.com/ScriptReference/Camera.WorldToScreenPoint.html
- 為Take Seat Btn添加一個Component
- 為該Component指出跟隨目標的Transform
- Btn UI在Update中不斷Locate(),移動到對應螢屏位置
- 使用Unity 提供的Cinemachine
- #1 使用Virtual Camera搭配Dolly Track
- https://www.youtube.com/watch?v=q1fkx94vHtg&list=PLX2vGYjWbI0TQpl4JdfEDNO1xK_I34y8P&index=2
- 設定一個Fellow Target Transform(代表Player),在Player移動時,Camera在指定的Dolly Track上跟隨Player移動
- 效果不太理想,實作略復雜,原因在于本例的重點不在跟隨,需要關注的是State Change(Stand up、Sit Down 0/1/2)
- #2 使用State-Driven Cameras
- https://www.youtube.com/watch?v=2X00qXErxIM&t=163s
- 設定Player Animator和State(Stand up、Sit Down 0/1/2),狀態遷移可以簡單的通過Seat Id equals xxx來實作(Stand up處seat id = -1)
- 為對應的State創建對應的camera
- #1 使用Virtual Camera搭配Dolly Track
using UnityEngine; namespace CameraMotion.Scripts { public class ScreenPosLocator : MonoBehaviour { public Transform followTransform; public Vector3 offset; public bool shouldFellow; private Camera camera; public void Awake() { camera = Camera.main; } public void Update() { Locate(); } private void Locate() { if (shouldFellow) { transform.position = camera.WorldToScreenPoint(followTransform.position + offset); } } } }[2] Seat
using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; namespace CameraMotion.Scripts { public class Seat : MonoBehaviour { public int seatId; public Button btnTakeSeat; public UnityEvent<Seat> playerSitDownEvent; private bool available; public void Awake() { available = true; btnTakeSeat.onClick.AddListener(OnOccupied); } public void Occupy() { available = false; } public void Release() { available = true; } public void Disable() { btnTakeSeat.gameObject.SetActive(false); } public void TryEnable() { if (available) { Enable(); } } private void Enable() { btnTakeSeat.gameObject.SetActive(true); } private void OnOccupied() { playerSitDownEvent?.Invoke(this); } } }[3] 在Editor中配置
== State-Driven Camera Motion ==
[1] 添加Cinemachine-
add a Cinemachine Brian component to your Main Camera
-
-
add a vcam(main): Object>Cinemachine>Virtual Camera
-
- 將Look At設定為桌面(Table Transform)
- 對Main Camera的Transform進行調整,獲得我們想要的主視角
-
add State-Driven Camera: GameObject>Cinemachine>State-Driven Camera
- 復制粘貼復制粘貼,注意需要的使用的vcam必須是CM StateDrivenCamera的Child
-
將各個Seat vcam的 Look At 均設定為Table
- 創建一個新的GameObject - Player,并為它創建一個Animator
-
為Player State Animator設定 States 和 Transitions, Take Seat 0/1/2分別代表玩家選中了該處座位
-
調整Transform 和 Ortho Size找到Player Sit Down視角
-
將Animated Target設定為 Player Animator
-
填入State和對應的Camera
== Repository ==
https://github.com/coreopsis0711/mini-mechanisms轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/445509.html
標籤:其他












