Bộ điều khiển trình phát RTS và MOBA cho Unity

Trong trò chơi điện tử, thuật ngữ RTS là viết tắt của chiến lược thời gian thực.

Sự khác biệt giữa RTS và các trò chơi bắn súng góc nhìn thứ nhất / thứ ba thông thường là các nhân vật được điều khiển bằng con trỏ chuột thay vì các nút W, A, S và D thông thường.

Người chơi được cung cấp cái nhìn toàn cảnh về chiến trường với khả năng ra lệnh cho quân đội mà không cần trực tiếp điều khiển họ. Ví dụ về trò chơi RTS là Warcraft, Starcraft, Cossacks, v.v.

Ảnh chụp màn hình trò chơi Warcraft 3

Mặt khác, MOBA là viết tắt của Multiplayer Online Battle Arena, đây là một nhánh con mới hơn của trò chơi RTS trong đó người chơi chỉ điều khiển một nhân vật thay vì nhiều nhân vật.

Ví dụ về các trò chơi như vậy là Liên minh huyền thoại và Dota 2.

Trong hướng dẫn này, tôi sẽ hướng dẫn cách tạo bộ điều khiển kiểu RTS/MOBA trong Unity.

Bước 1: Hãy tạo (các) tập lệnh cần thiết

Hướng dẫn này khá đơn giản vì nó chỉ yêu cầu một tập lệnh.

RTSPlayerController.cs

//You are free to use this script in Free or Commercial projects
//sharpcoderblog.com @2018

using UnityEngine;
using UnityEngine.AI;

[RequireComponent(typeof(NavMeshAgent))]

public class RTSPlayerController : MonoBehaviour
{
    public Camera playerCamera;
    public Vector3 cameraOffset;
    public GameObject targetIndicatorPrefab;
    NavMeshAgent agent;
    GameObject targetObject;

    // Use this for initialization
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        //Instantiate click target prefab
        if (targetIndicatorPrefab)
        {
            targetObject = Instantiate(targetIndicatorPrefab, Vector3.zero, Quaternion.identity) as GameObject;
            targetObject.SetActive(false);
        }
    }

    // Update is called once per frame
    void Update()
    {
#if (UNITY_ANDROID || UNITY_IOS || UNITY_WP8 || UNITY_WP8_1) && !UNITY_EDITOR
            //Handle mobile touch input
            for (var i = 0; i < Input.touchCount; ++i)
            {
                Touch touch = Input.GetTouch(i);

                if (touch.phase == TouchPhase.Began)
                {
                    MoveToTarget(touch.position);
                }
            }
#else
        //Handle mouse input
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            MoveToTarget(Input.mousePosition);
        }
#endif

        //Camera follow
        playerCamera.transform.position = Vector3.Lerp(playerCamera.transform.position, transform.position + cameraOffset, Time.deltaTime * 7.4f);
        playerCamera.transform.LookAt(transform);
    }

    void MoveToTarget(Vector2 posOnScreen)
    {
        //print("Move To: " + new Vector2(posOnScreen.x, Screen.height - posOnScreen.y));

        Ray screenRay = playerCamera.ScreenPointToRay(posOnScreen);

        RaycastHit hit;
        if (Physics.Raycast(screenRay, out hit, 75))
        {
            agent.destination = hit.point;

            //Show marker where we clicked
            if (targetObject)
            {
                targetObject.transform.position = agent.destination;
                targetObject.SetActive(true);
            }
        }
    }
}

Bước 2

Bây giờ hãy thiết lập bộ điều khiển người chơi và cấp độ trò chơi.

  • Tạo một GameObject mới và gọi nó 'RTSPlayer'
  • Đính kèm tập lệnh RTSPlayerController.cs vào nó (LƯU Ý: Sau khi đính kèm, nó sẽ tự động thêm một thành phần khác có tên NavMeshAgent, thành phần này sẽ cần thiết sau này)

  • Thêm phần thân người chơi (trong trường hợp của tôi, tôi sẽ sử dụng một hộp đơn giản có cube, nhưng bạn có thể thêm mô hình người chơi nếu có). Thu nhỏ nó xuống cho đến khi kích thước mong muốn.
  • Di chuyển mô hình trình phát bên trong 'RTSPlayer' GameObject (LƯU Ý: Trước khi nuôi dạy con cái, hãy đảm bảo 'RTSPlayer' được đặt ở cuối mô hình trình phát)

  • Chọn 'RTSPlayer' và trong NavMeshAgent điều chỉnh Bán kính và Chiều cao cho đến khi nó khớp với mô hình trình phát

  • Tiếp theo là tạo Chỉ báo mục tiêu prefab. Đây chỉ là một GameObject đơn giản với Quad sẽ cho biết nơi chúng ta đã nhấp vào trên bản đồ.

Bạn có thể sử dụng kết cấu dưới đây:

chỉ báo mục tiêu chiến lược thời gian thực

  • Và cuối cùng, chọn 'RTSPlayer' và gán tất cả các biến cần thiết trong tập lệnh RTSPlayerController:

Player Camera - là tự giải thích, đây có thể là bất kỳ máy ảnh nào

Camera Offset - khoảng cách giữa camera và người chơi

Chỉ báo mục tiêu Prefab - prefab chúng tôi vừa tạo

Khi ở chế độ Chơi, bạn sẽ nhận thấy rằng việc nhấp vào bản đồ không khiến người chơi di chuyển. Đó là bởi vì chúng ta còn một việc cuối cùng phải làm, đó là Nướng một Navigation Mesh (Navmesh):

  • Chọn tất cả các đối tượng là một phần của bản đồ và đánh dấu chúng là tĩnh:

  • Đi tới Cửa sổ -> AI -> Điều hướng

  • Trong tab Bake, thay đổi các giá trị Bán kính tác nhân và Chiều cao tác nhân (những giá trị này phải khớp với các giá trị từ NavMeshAgent), sau đó nhấp vào Nướng.

  • Sau khi nướng xong, bạn sẽ thấy một lưới có đường viền màu xanh lam tượng trưng cho khu vực có thể đi bộ.

LƯU Ý: Để ngăn người chơi đi qua đồi, hãy quay lại tab Nướng và giảm góc Độ dốc tối đa sau đó nướng lại lưới điều hướng.

Tốt hơn nhiều!

Cuối cùng, quay lại chế độ Play và nhấp chuột trái vào nơi nào đó trên bản đồ.

Bây giờ người chơi phải di chuyển về phía mục tiêu trong khi tránh các chướng ngại vật:

Sharp Coder Trình phát video

Mẹo: Tinh chỉnh giá trị Tốc độ, Tốc độ góc và Gia tốc tại NavMeshagent để phù hợp với nhu cầu của bạn.