U
tab 01Căn bản11 bài — chạm để mở
09 / 11 · 12 phút
Căn bản

Đổi qua lại giữa các nhân vật trên sàn

dự án của bạn tới lúc này

Assets/

Scenes/

Arena.unity

FloorKnightMageArcherGameManager

Scripts/

GridSpawner.csSimpleMover.csCharacterSwitcher.csSwapCamera.cs

Prefabs/

P_Cube

đã 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.

sơ đồ động

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. 1

    GameObject▸3D Object▸Capsule, đặt tên Knight, Position 0, 1, 0.

  2. 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. 3

    Nhân bản hai lần (Ctrl/Cmd + D) → Mage ở -3, 1, 0 và Archer ở 3, 1, 0.

  4. 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. 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

SimpleMover.cs — attach to all three characters
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.

CharacterSwitcher.cs — attach to an empty GameManager
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. 1

    Tạo GameObject rỗng tên GameManager và gắn CharacterSwitcher vào.

  2. 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. 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. 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

Capsule vẫn đứng trên sàn, vẫn thấy, vẫn đặc. Nó chỉ ngừng nhận phím.

✖ SetActive(false)

Tắt cả đối tượng

Cả nhân vật biến mất khỏi cảnh — sai với ý muốn để cả nhóm cùng đứng trên sàn.

Bước 4 — camera bám theo nhân vật đang chọn

SwapCamera.cs — attach to Main Camera
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.