一新建 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 预制件