目录
35、关卡管理器基础开发
测试
36、关卡管理器开始逻辑完善

目录
35、关卡管理器基础开发
测试
36、关卡管理器开始逻辑完善
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;
}
}
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中更新代码
由于涉及到关卡的切换,所以阳光的生成和停止生成,也需要分别设置一个外部的方法来控制