Đổi qua lại giữa các nhân vật trên sàn
Assets/
Scenes/
Arena.unity
Scripts/
Prefabs/
đã có sẵnbài này thêm
Đây là cột mốc của Tab 01. Một sàn phẳng, ba nhân vật đứng trên đó, bấm phím 1 / 2 / 3 để đổi nhân vật đang điều khiển.
Mỗi lúc chỉ một nhân vật được kích hoạt; những nhân vật khác đứng chờ trên sàn.
Bước 1 — ba nhân vật tạm
- 1
, đặt tên Knight, Position 0, 1, 0.
- 2
Capsule mặc định cao 2 m, tâm ở giữa, nên Y = 1 là chân chạm đúng mặt sàn.
- 3
Nhân bản hai lần (Ctrl/Cmd + D) → Mage ở -3, 1, 0 và Archer ở 3, 1, 0.
- 4
Gán cho mỗi nhân vật một material màu: xanh lá, tím, vàng. Nhìn phát biết ngay ai là ai.
- 5
Tạo GameObject rỗng tên Characters và kéo cả ba vào trong.
Bước 2 — một script di chuyển dùng chung
using UnityEngine;
public class SimpleMover : MonoBehaviour
{
[SerializeField] private float speed = 6f;
[SerializeField] private float turnSpeed = 12f;
void Update()
{
//nhận -1..1 từ phím A/D và W/S
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
Vector3 dir = new Vector3(h, 0f, v);
if (dir.sqrMagnitude < 0.01f) return; // không bấm thì thôi
dir.Normalize(); // đi chéo không nhanh hơn
transform.position += dir * speed * Time.deltaTime;
//quay mặt theo hướng đi
Quaternion target = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Slerp(transform.rotation, target, turnSpeed * Time.deltaTime);
}
}GetAxisRaw trả về ngay -1, 0 hoặc 1. GetAxis làm mượt qua vài khung hình — bản raw cho cảm giác nhạy hơn.
sqrMagnitude là độ dài chưa khai căn: rẻ hơn, và ta chỉ so nó với một ngưỡng nên không cần khai căn.
Slerp xoay một phần quãng đường mỗi khung hình, cho cảm giác quay mượt thay vì giật một phát.
Bước 3 — bộ chuyển nhân vật
Mẹo rất đơn giản: giữ một danh sách, bật một, tắt phần còn lại. Chỉ tắt SimpleMover (chứ không tắt cả đối tượng) để mọi nhân vật vẫn hiện trên sàn.
using System.Collections.Generic;
using UnityEngine;
public class CharacterSwitcher : MonoBehaviour
{
[SerializeField] private List<SimpleMover> characters = new List<SimpleMover>();
[SerializeField] private Transform highlightRing; // vòng sáng, tuỳ chọn
private int activeIndex = 0;
void Start()
{
Select(0);
}
void Update()
{
//phím số 1..9
for (int i = 0; i < characters.Count && i < 9; i++)
if (Input.GetKeyDown(KeyCode.Alpha1 + i))
Select(i);
//phím Tab để xoay vòng
if (Input.GetKeyDown(KeyCode.Tab))
Select((activeIndex + 1) % characters.Count);
}
public void Select(int index)
{
if (index < 0 || index >= characters.Count) return;
activeIndex = index;
for (int i = 0; i < characters.Count; i++)
characters[i].enabled = (i == index); // chỉ một người đi được
if (highlightRing != null)
highlightRing.SetParent(characters[index].transform, false);
Debug.Log("Now controlling: " + characters[index].name);
}
public Transform ActiveCharacter => characters[activeIndex].transform;
}- 1
Tạo GameObject rỗng tên GameManager và gắn CharacterSwitcher vào.
- 2
Trong Inspector, đặt kích thước danh sách Characters là 3 rồi kéo Knight, Mage, Archer vào các ô.
- 3
Kéo một cylinder dẹt (scale 1.2, 0.02, 1.2) vào ô Highlight Ring để thấy ai đang được chọn.
- 4
Bấm Play, di chuyển bằng WASD, đổi nhân vật bằng 1 2 3 hoặc Tab.
Vì sao tắt script chứ không tắt GameObject?
✓ characters[i].enabled = false
Tắt script
✖ SetActive(false)
Tắt cả đối tượng
Bước 4 — camera bám theo nhân vật đang chọn
using UnityEngine;
public class SwapCamera : MonoBehaviour
{
[SerializeField] private CharacterSwitcher switcher;
[SerializeField] private Vector3 offset = new Vector3(0f, 12f, -14f);
[SerializeField] private float smooth = 4f;
void LateUpdate() // sau khi mọi thứ đã di chuyển
{
Transform target = switcher.ActiveCharacter;
Vector3 wanted = target.position + offset;
transform.position = Vector3.Lerp(transform.position, wanted, smooth * Time.deltaTime);
transform.LookAt(target.position + Vector3.up);
}
}Sân đấu giờ làm được gì
Một cảnh 3D có sàn phẳng, vật liệu, camera và đèn.
Prefab hình khối, nhân bản bằng tay hoặc bằng vòng lặp.
Nhiều nhân vật trên sàn đó, chuyển quyền điều khiển qua lại được.
Bài sau đặt menu và nhạc lên trên tất cả những thứ này, mà không phải sửa gì bên trong.
Tab 02 sẽ nâng cấp Knight tại chỗ — vẫn GameObject đó, vẫn tên đó, vẫn ô đó trong switcher — thành nhân vật thật có model, hoạt ảnh, skill và artifact. Mage với Archer giữ nguyên capsule để bạn thấy được khác biệt.