Unity 2D游戏开发: 角色生成点

Nan (/)
2024-05-20T21:57:55+08:00

一新建 GameManager 游戏管理類

采用單例模式

GameManager 游戏管理類

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager gameManager = null; // 单例對象
    public SpawnPointUtil spawnPointUtil; // 生成点工具類单例
    public CameraManager cameraManager;

    void Awake()
    {
        // 避免重复創建单例
        // 如果单例不存在 或 已存在单例不是当前對象
        if (gameManager != null && gameManager != this) {
            // 销毁当前遊戲對象
            Destroy(gameObject);
        } else {
            // 单例對象等于当前對象
            gameManager = this;
        }
    }

    void Start()
    {
        Debug.Log("GameManager");
        SetupScene();
    }

    /// 初始化
    public void SetupScene()
    {
        CreateCharacter();
    }

    /// 創建角色
    public void CreateCharacter()
    {
        if (spawnPointUtil != null)
        {
            Debug.Log("CreateCharacter");
            GameObject player = spawnPointUtil.CreateObject();
            cameraManager.virtualCamera.Follow = player.transform;
        }
    }
}

二新建 SpawnPointUtil 生成点工具類

SpawnPointUtil

using UnityEngine;

public class SpawnPointUtil : MonoBehaviour
{
    public GameObject objectPrefab; // 生成對象預制件
    public float interval; // 生成间隔时间

    void Start()
    {
        Debug.Log("SpawnPointUtil");
        if (interval > 0)
        {
            // 在 0.0f 秒后调用 CreateObject 方法，然后每 interval 秒调用一次。
            InvokeRepeating("CreateObject", 0.0f, interval);
        }
    }

    /// 創建對象
    public GameObject CreateObject()
    {
        Debug.Log("CreateObject" + objectPrefab.name);
        if (objectPrefab != null)
        {
            return Instantiate(objectPrefab, transform.position, Quaternion.identity);
        }
        return null;
    }
}

三新建 CameraManager 摄像机管理類跟踪玩家

挂載到 Virtual Camera 遊戲對象上

using UnityEngine;
using Cinemachine;

public class CameraManager : MonoBehaviour
{
    public static CameraManager cameraManager = null;
    [HideInInspector]
    public CinemachineVirtualCamera virtualCamera;

    void Awake()
    {
        if (cameraManager != null && cameraManager != this)
        {
            Destroy(gameObject);
        }
        else
        {
            cameraManager = this;
        }

        GameObject virtualCameraObject = GameObject.FindWithTag("VirtualCamera");
        virtualCamera = virtualCameraObject.GetComponent<CinemachineVirtualCamera>();
    }
}

四 創建預制件

3.1 新建 GameManager 遊戲管理預制件

1. 創建 空遊戲對象 重命名爲 GameManager

2. 挂載 `GameManager 脚本到遊戲對象

3. 制作 GameManager 預制件

4. 修改屬性: 檢查器 -> GameManager
spawnPointUtil: PlayerSpawnPoint
cameraManager : Virtual Camera 遊戲對象

3.2 新建 SpawnPointUtil 生成点預制件

5. 創建 空遊戲對象 重命名爲 SpawnPointUtil

6. 挂載 SpawnPointUtil 脚本到遊戲對象

7. 制作 SpawnPointUtil 預制件

3.3 新建 PlayerSpawnPoint 玩家生成点預制件

1. 新建 SpawnPointUtil 預制件实例重命名爲 PlayerSpawnPoint
檢查器 -> SpawnPointUtil -> objectPrefab: PlayerObject 預制件

3.4 新建 EnemySpawnPoint 敌人生成点預制件

1. 新建 SpawnPointUtil 預制件实例重命名爲 EnemySpawnPoint
檢查器 -> SpawnPointUtil -> objectPrefab: EnemyObject 預制件