Cinemachine và rung camera
Assets/
Scenes/
Arena.unity
thiết lập dự án
đã có sẵnbài này thêmbài này thay thế
Bước ba, cũng là bước cuối. Cinemachine thay cả FollowCamera lẫn OrbitCamera bằng component chỉ cần cấu hình — và nó xử lý chống xuyên tường, độ trễ, chuyển cảnh tốt hơn code bạn vừa viết.
Cùng ý tưởng xoay quanh, nhưng độ trễ, chống xuyên tường và canh khung đều có sẵn.
Cài đặt và thiết lập
- 1
→ tìm Cinemachine → Install.
- 2
(Cinemachine 3: CinemachineCamera).
- 3
Unity tự thêm CinemachineBrain vào Main Camera. Cái brain đó mới là thứ điều khiển camera thật.
- 4
Trên virtual camera, đặt Follow = Knight và Look At = CameraTarget của Knight.
Cách hình dung
Virtual camera không phải camera. Nó là công thức: 'đứng đây, nhìn kia, với độ trễ chừng này'.
Cái Brain trên Main Camera chọn virtual camera có Priority cao nhất đang bật, rồi chuyển mượt sang nó.
Nên đổi camera chỉ là đổi Priority hoặc gọi SetActive — phần chuyển cảnh có sẵn, không tốn code.
Camera góc nhìn thứ ba chỉ với hai cú click
- 1
Trên virtual camera, đặt Body = Third Person Follow (hoặc Orbital Follow ở CM3).
- 2
Đặt Camera Distance 6, Shoulder Offset X 0.5, Damping 0.3 / 0.3 / 0.3.
- 3
Đặt Camera Collision Filter là các layer môi trường — vấn đề xuyên tường coi như xong.
- 4
Đặt Aim = Do Nothing nếu rig đã hướng đúng, hoặc Composer để luôn giữ mục tiêu trong khung.
✓ Hand-written camera
Camera tự viết
✓ Cinemachine
Dùng Cinemachine
Rung camera bằng Impulse
- 1
Thêm Cinemachine Impulse Listener vào virtual camera.
- 2
Thêm Cinemachine Impulse Source vào thứ phát nổ hoặc gây sát thương.
- 3
Gọi GenerateImpulse() từ code, mọi listener trong tầm sẽ rung.
using UnityEngine;
using Unity.Cinemachine; // Cinemachine 2: using Cinemachine;
public class HitShake : MonoBehaviour
{
[SerializeField] private CinemachineImpulseSource source;
public void Shake(float strength = 1f)
{
source.GenerateImpulseWithForce(strength);
}
}Đổi camera cho skill hoặc cutscene
[SerializeField] private CinemachineCamera gameplayCam;
[SerializeField] private CinemachineCamera ultimateCam;
public void PlayUltimate()
{
ultimateCam.Priority = 20; // số cao hơn thắng
Invoke(nameof(BackToGameplay), 2f);
}
void BackToGameplay() => ultimateCam.Priority = 0;