SAIMA/Assets//脚本/CameraControllerInStart.cs
Roman e6888a748d 任务:编写教程和开始场景
分析:分为五个阶段,每个阶段一屏宽。前四个阶段是教程阶段,分别仅放一种障碍(第一个无障碍)和提示,提示参照茶杯头教程关。
每个阶段间有明显间断、镜头固定,但当马通过该阶段的障碍后,镜头右移一个阶段。马不能倒退,相机左侧有空气墙。
到达最终阶段后,按流程点燃圣火进入游戏

设计:
1.搭建核心场景,放置障碍物。
DONE
2.设计教程及开始场景管理器
(1.控制相机,使马每通过一个阶段,相机运动到记录的位置
DONE
(2.给相机左侧添加空气墙
DONE
(3.管理器要明确记录此时玩家处于哪个阶段
DONE
(4.当玩家进入点燃圣火触发器,切断操控,等待动画结束或者一些信号,触发从右向左的渐变黑幕遮挡全屏,随后转场到新场景。
DONE

至此,基本逻辑完成,需要补充大量细节、替换大量美术素材。

修复问题:
1.人马分离障碍连续出现可能导致致命问题,修复使其不能连续出现
DONE
2.GamePlay中,远处的山需要补充运动逻辑
DONE
2022-08-26 18:11:05 +08:00

113 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using Sirenix.OdinInspector;
/// <summary>
/// 主要用于控制教程场景下,相机的阶段性移动
/// </summary>
public class CameraControllerInStart : UnitySingleton<CameraControllerInStart>
{
public enum State{None, Walk, Jump, Speed, Break, Statr}
[FoldoutGroup("信息显示")][Title("此时处于状态")][EnumPaging]
public State state = State.Walk;
[FoldoutGroup("基本参数")][Title("相机在阶段间运动需要的时间")]
public float cameraMoveDuration;
/// <summary>
/// 阶段,包含本阶段的所有信息
/// </summary>
public struct Step{
/// <summary>
/// 本阶段的名字
/// </summary>
public State name;
/// <summary>
/// 本阶段下,相机应该在哪个位置
/// </summary>
public Vector3 pos;
}
private class StepListener : MonoBehaviour
{
public Step step;
private void OnTriggerEnter2D(Collider2D other) {
if(other.TryGetComponent<Person>(out var person)){
//当检测到人进入并且此时相机正处于本状态触发相机的移动到下一个Step
if(CameraControllerInStart.Instance.state == step.name && person.state == Person.PersonState.Normal){
CameraControllerInStart.Instance.MoveToTheStep(step.name);
}
}
}
}
private Step[] steps;
private void Start() {
//初始化5个阶段的信息
steps = new Step[5];
//遍历子物体根据名称初始化Step信息
for (int i = 0; i < transform.childCount; i++) {
Transform child = transform.GetChild(i);
child.gameObject.AddComponent<StepListener>();
if (child.name == "Walk") {
steps[0].name = State.Walk;
steps[0].pos = child.position;
child.GetComponent<StepListener>().step = steps[0];
}
else if (child.name == "Jump") {
steps[1].name = State.Jump;
steps[1].pos = child.position;
child.GetComponent<StepListener>().step = steps[1];
}
else if (child.name == "Speed") {
steps[2].name = State.Speed;
steps[2].pos = child.position;
child.GetComponent<StepListener>().step = steps[2];
}
else if (child.name == "Break") {
steps[3].name = State.Break;
steps[3].pos = child.position;
child.GetComponent<StepListener>().step = steps[3];
}
else if (child.name == "Start") {
steps[4].name = State.Statr;
steps[4].pos = child.position;
child.GetComponent<StepListener>().step = steps[4];
}
}
}
/// <summary>
/// 相机运动到指定阶段的位置
/// </summary>
/// <param name="state">下一个阶段</param>
public void MoveToTheStep(State state){
Step step = State2Step(state);
Camera.main.transform.DOMoveX(step.pos.x + 40f, cameraMoveDuration);
this.state = ++step.name;
}
private Step State2Step(State state){
switch (state) {
case State.Walk:
return steps[0];
case State.Jump:
return steps[1];
case State.Speed:
return steps[2];
case State.Break:
return steps[3];
case State.Statr:
return steps[4];
default:
return steps[0];
}
}
}