Roman 3e4b099d18 任务:替换现有美术素材和动画、完善游戏的流程化
场景【第二关】
1.创建事件【当修完电报机】,包含以下流程
(*关闭玩家的操作地图
(1.给玩家若干反应时间,然后关闭修理电报机界面
(2.再过若干时间,镜头跟踪物改为敌人
(3.同时,敌人的targe改为玩家
(4.若干时间后,镜头跟踪物改为玩家
(5.若干短时间后,敌人的target改为普通巡逻点
(6.若干时间后,弹出对话【被发现了】
(7.对话结束后,弹出电报机界面,要求打【埋伏,无法返回】,同时,激活倒计时UI。
(8.倒计时结束后,激活黑幕UI,短时间后播放两声枪响
(9.游戏结束
*:创建对话:【被发现了】
2021-09-03 18:08:56 +08:00

157 lines
5.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 UnityEngine.InputSystem;
public class RepairBench : Interactive
{
//修理台类,控制修理相关的功能,继承可交互物体基类
// Start is called before the first frame update
private bool isRunning = false;//记录目前是否在使用修理台的变量
private RectTransform needle;//指针的UI位置组件用来控制指针旋转
[Tooltip("请填入指针旋转的速度")]
public float needleSpeed;//指针旋转速度
private RectTransform[] areas;//记录三个正确区60~45~30
private bool[] areasHasClear;//记录三个正确区是否已被修复
private RectTransform isReparing;//正在修复的区域
private bool canRing = false;//记录指针是否能转动的变量
[Tooltip("请填入当你按下确认后,指针停止的时间")]
public float stopTime;
[Tooltip("请拖入修好机器后的事件")]
public Event endEvent;
void Start()
{
//初始化指针
needle = m_interface.transform.Find("指针").GetComponent<RectTransform>();
//初始化正确区域
areas = new RectTransform[3];
areas[0] = m_interface.transform.Find("60").GetComponent<RectTransform>();
areas[1] = m_interface.transform.Find("45").GetComponent<RectTransform>();
areas[2] = m_interface.transform.Find("30").GetComponent<RectTransform>();
//初始化已被修复标记
areasHasClear = new bool[3]{false,false,false};
//都是从60的开始修所以初始化正在修的为60
isReparing = areas[0];
//把60旋转随机一个角度
isReparing.rotation = Quaternion.Euler(
//x、y不变,都是0
0,0,
//z
Random.Range(0,360)
);
//给指针赋予针控件
needle.gameObject.AddComponent<Needle>();
}
// Update is called once per frame
void Update()
{
if(isRunning)//如果正在运行
{
if(canRing)NeedleRun();//让指针转
}
}
private void NeedleRun()
{
needle.rotation = Quaternion.Euler(
//x、y不变,都是0
0,0,
//z
needle.rotation.eulerAngles.z +//原先自身角度加上
needleSpeed *//指针的运动速度乘以
-1*//使正值代表顺时针
Time.deltaTime//使其与实践无关
);
}
public override void OnCall()
{
m_interface.SetActive(true);//打开修理页面
isRunning = true;//标记自身正在修理
//修改玩家的操作地图到修复机器
FindObjectOfType<M_Player>().GetComponent<PlayerInput>().SwitchCurrentActionMap("PlayerInReparingTheMachine");
canRing = true;//标记可以开始转动指针
}
public override void Comfirm()
{
//当传入玩家按下交互键的信号
//让指针停下
canRing = false;
//在若干时间后重新转动指针
Invoke("ReRing",stopTime);
//检查判定结果
if(needle.GetComponent<Needle>().CanYouSuccess())
{
//如果成功
//找到正在修的区域并标记其为已修好
for(int i = 0; i < areas.Length; i++)
{
if(isReparing.Equals(areas[i])) areasHasClear[i] = true;
}
//检查是否所有区域都已完成
if(areasHasClear[0]&&areasHasClear[1]&&areasHasClear[2])
{
//如果全都完成
//关闭界面
//m_interface.SetActive(false);
//触发结束事件
endEvent.OnCall();
}
else
{
//如果还有未完成区域,若干时间后,替换到下一个区域
Invoke("InitSucceedArea",stopTime);
}
}
else
{
//如果失败,若干时间后重新转动指针
Invoke("ReRing",stopTime);
}
}
private void InitSucceedArea()
{
//首先找到下一个还没修的区域
for(int i = 0; i < areas.Length; i++)
{
if(areasHasClear[i] == false){isReparing.gameObject.SetActive(false);//关闭上一个修好的区域
isReparing = areas[i];
break;}
}
//把它打开
isReparing.gameObject.SetActive(true);
//旋转到随机一个角度
isReparing.rotation = Quaternion.Euler(
//x、y不变,都是0
0,0,
//z
Random.Range(0,360)
);
}
//重新标记指针可以转动,协程用
private void ReRing(){canRing = true;}
private class Needle : MonoBehaviour
{
private bool canNow = false;//记录此瞬间按下交互的话,能不能成功
//当针头进入成功区,标记其为可以成功,否则标记为不可成功
public void OnTriggerEnter2D(Collider2D other){canNow = true;}
public void OnTriggerExit2D(Collider2D other){canNow = false;}
//返回当前是否在成功区内
public bool CanYouSuccess(){return canNow;}
}
}