栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

【Unity植物大战僵尸】关卡管理器开发(上)(十九)

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Unity植物大战僵尸】关卡管理器开发(上)(十九)

目录

35、关卡管理器基础开发

测试

36、关卡管理器开始逻辑完善


35、关卡管理器基础开发 首先创建关卡管理脚本 新添加三个状态 因为开始状态涉及到隐藏面板和摄像机的运动,所以 摄像机功能上,新添加脚本 添加代码:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
    public static CameraController instance;
    private void Awake()
    {
        instance = this;
        transform.position = new Vector3(-3.02f, 0.2f, -10);
    }
    /// 
    /// 关卡开始时的移动
    /// 
    public void MoveForLvStart()
    {
        StartCoroutine(DoMove(2.83f));
    }
    IEnumerator DoMove(float targetPosX)
    {
        // 获取摄像机移动到的一个目标地点
        Vector3 target = new Vector3(targetPosX, transform.position.y, -10);
        // 获取一个标准的方向向量
        Vector2 dir = (target - transform.position).normalized;
        // 如果距离目标点大于0.1则一直移动
        while (Vector2.Distance(target, transform.position) > 0.1)
        {
            yield return new WaitForSeconds(0.01f);
            transform.Translate(dir * 0.1f);
        }
    }
    
}
因为涉及到面版隐藏,所以解决一个bug 最后简单实现一下开始游戏时,摄像机运动和面板隐藏
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum LVState
{
    // 开始游戏
    Start,
    // 战斗中
    Fight,
    // 结束
    Over
}
public class LVManager : MonoBehaviour
{
    public static LVManager instance;
    private void Awake()
    {
        instance = this;
    }
    private LVState currLvState;
    public LVState CurrLvState
    {
        get => currLvState;
        set
        {
            currLvState = value;
            switch (currLvState)
            {
                case LVState.Start:
                    // 隐藏UI面板
                    UIManager.instance.SetMainPanelActive(false);
                    // 摄像机移动到右侧观察关卡僵尸
                    CameraController.instance.MoveForLvStart();
                    // 移动到左侧并显示UI
                    // 切换成战斗状态
                    break;
                case LVState.Fight:
                    break;
                case LVState.Over:
                    break;
            }
        }
    }
    private void Start()
    {
        CurrLvState = LVState.Start;
    }
}

测试

36、关卡管理器开始逻辑完善 摄像机往右移动后,就要往左移动,更新CameraController.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class CameraController : MonoBehaviour
{
    public static CameraController instance;
    private void Awake()
    {
        instance = this;
        transform.position = new Vector3(-3.02f, 0.2f, -10);
    }
    public void StartMove(UnityAction action)
    {
        // 一开始往右,然后回归,回归到终点时调用传进来的委托方法
        MoveForLvStart(() => MoveForLvStartBack(action));
    }
    
    /// 
    /// 关卡开始时的移动
    /// 
    private void MoveForLvStart(UnityAction action)
    {
        StartCoroutine(DoMove(2.83f,action));
    }
    /// 
    /// 关卡开始时的摄像机回归
    /// 
    private void MoveForLvStartBack(UnityAction action)
    {
        StartCoroutine(DoMove(-3.02f,action));
    }
    IEnumerator DoMove(float targetPosX, UnityAction action)
    {
        // 获取摄像机移动到的一个目标地点
        Vector3 target = new Vector3(targetPosX, transform.position.y, -10);
        // 获取一个标准的方向向量
        Vector2 dir = (target - transform.position).normalized;
        // 如果距离目标点大于0.1则一直移动
        while (Vector2.Distance(target, transform.position) > 0.1)
        {
            yield return new WaitForSeconds(0.035f);
            transform.Translate(dir * 0.1f);
        }
        // 此时摄像机到达最右边,停顿1.5s
        yield return new WaitForSeconds(1f);
        // 执行事件
        if (action != null) action(); 
    }
    
}
然后在LVManager.cs中更新代码 由于涉及到关卡的切换,所以阳光的生成和停止生成,也需要分别设置一个外部的方法来控制

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/905964.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号