Roman 01a670fb19 任务:实装和完善部分音效,修复场景问题
1.实装玩家回头查看老兵出发对话的情节
2.降低了打开电报机音效的音量
3.更换第二段CG,实现淡入淡出效果
4.当玩家还没修完电话线就和电报机互动,触发对话【没修完呢】
5.将新的出字音效实装到每一个场景
6.解决如果玩家投掷过快会导致无法退出投掷状态的Bug
7.实装大部分BGM
8.给序章战场的假电报机也加上没连完线的对话
9.新增开发者捷径,如果输入。。--。直接判定打完全部句子

(*:建议把碉堡发令员的指挥做成动态的
(*:第二关的炮火已经越来越好了,但是目前只有炮火,晚上肯定也会开枪吧?希望增加一些随机快速闪烁的光源表示晚上的枪。
(*目前碉堡音效出现和消失得十分突然,建议在首尾稍微加一些淡入淡出效果
(*:建议把倒地后的机枪手也加上调查对话

xx:人声问题请待定,加上音乐后好像又不是很违和了
(*:碉堡警告音效系统做完了,但是人声感觉上非常奇怪,建议修改
(*:敌人被石头吸引系统实装完成,但是很突兀,建议还是不要出现语言了

接下来的任务:
1.实装按键引导
2.更换投掷物堆系统为火堆系统
3.实装第二关最后追逐关卡
4.制作开始界面
5.制作Thanks 4 Play

能看到效果的努力,这回有动力了吧?加油吧
2021-09-12 02:19:08 +08:00

201 lines
9.3 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.UI;
using UnityEngine.InputSystem;
using Fungus;
public class Machine : Interactive
{
//电报机类。控制电报机的信息和各种功能,非常关键🤖
private Text codeTextView;//电码TextView显示目前打了打码
private IndexRecoder indexRecoder;//策划数值接口
private AllLinesInfo linesChecker;//路线信息
[Tooltip("把这台机器需要打的句子拖进来,在:抽象的东西->句子们。没有就自己建一个创建新物体加上Sentence组件")]
public Sentence[] sentences;//这台机器需要的句子们
private string code;//目前记录中已打的电码
private string tempTranslateResult;//临时翻译结果,一般是数字序列
[Tooltip("机器电码打完后的事件,由于不同的机器打完后触发的东西不一样,所以用事件像拼图一样把这个函数写在外面")]
public Event m_Event;//机器电码打完后的事件,由于不同的机器打完后触发的东西不一样,所以用事件像拼图一样把这个函数写在外面
[Tooltip("界面展示需要打的句子的TextView数组请把对应的显示句子的TextView们拖进来。就算后面两行不够也直接加就行。但是要记得和sentencs数组的长度相同")]
public Text[] sentencesTextView;//界面展示需要打的句子的TextView数组
private RectTransform handleUp;
private RectTransform handleDown;//电报机UI把手弹起和按下的图片
[Tooltip("请拖入翻页动画的那个游戏物体")]
public Animator turnPagesAnimation;
public AudioSource tearAudio;//撕纸音效
public AudioSource OnAudio;//电报机开机音效
void Start()
{
codeTextView = m_interface.GetComponentInChildren<Text>();
indexRecoder = FindObjectOfType<IndexRecoder>();
linesChecker = FindObjectOfType<AllLinesInfo>();
handleUp = m_interface.
GetComponent<RectTransform>().
Find("电报机图片").
Find("把手-抬起").
GetComponent<RectTransform>();//根据路径和名称找到把手图片
handleDown = m_interface.
GetComponent<RectTransform>().
Find("电报机图片").
Find("把手-按下").
GetComponent<RectTransform>();//根据路径和名称找到把手图片
}
//电报机界面被打开的时候调用
public override void OnCall()
{
if(LinesCheck())//如果线路全通
{
m_interface.SetActive(true);//把这个交互对象的界面打开,这里是电报机界面
OnAudio.Play();
ShwoTheSentencesInfo();//初始化展示电报机界面的需要打的句子
UpdateTheSentencesTextViewStates();//更新一下显示句子TextView的颜色状态
//更换玩家操作地图,使玩家操作电报机的时候只监听交互键
FindObjectOfType<M_Player>().GetComponent<PlayerInput>().SwitchCurrentActionMap("PlayerInCoding");
}
else
{
//如果还有线路没通,弹出对话【没修完呢】
FindObjectOfType<PlayerInput>().SwitchCurrentActionMap("NullMap");
Flowchart.BroadcastFungusMessage("没修完呢");
}
}
public override void ChangeHandleTo(bool isDown)
{
handleUp.gameObject.SetActive(!isDown);
handleDown.gameObject.SetActive(isDown);
}
//更新界面句子们的颜色信息的函数,黄色代表该句正在打,绿色代表该句已经完成,红色代表该句等待打
private void UpdateTheSentencesTextViewStates()
{
bool firstFlag = true;//设立一个首次标记,因为首次碰到没打完的标记为黄色,表示正在打此句
for(int i = 0; i < sentences.Length; i++)//便利每一个句子
{
if(sentences[i].IsThisFinished()) sentencesTextView[i].color = Color.green;//如果打完了,标记为绿色
else if(firstFlag){sentencesTextView[i].color = Color.yellow;firstFlag = false;}//如果第一次碰到没打完的,标记为黄色,表示在打
else sentencesTextView[i].color = Color.red;//此外代表没打的,标记为红色
}
}
//初始化展示电报机界面的需要打的句子的函数,一般只在电报机界面启动的时候调用一次
private void ShwoTheSentencesInfo()
{
for(int i = 0; i < sentences.Length; i++)//便利每一个句子把句子的内容放到对应的TextView里面
{
sentencesTextView[i].text = //把对应textView的内容设置为
sentences[i].content +//句子的中文加上
"\n" +//换一行加上
sentences[i].num;//句子对应的数字序列
//粗鲁的写法但是后期这个会更新仅作debug使用
}
}
//用来检查电话线的函数如果电话线全通返回true否则返回false
private bool LinesCheck()
{
//if(linesChecker.needCount == linesChecker.OKCount) return true;过时的方法
if(linesChecker.AreYouOK()) return true;
else return false;
}
//从Player类发消息来调用这个函数temp为接受到的字符可能是. || -。
public override void Coding(string temp)
{
code += temp;
if(code.Length >= 5) StartCoroutine("ClearChecker");//当长度超过5位每打一位就检查一下是否有特殊字符
if(code.Length % 5 == 0)
{
Translate(code);//每输入五位就翻译一下
CompleteChecker();//每五位要检查一下句子是否打对了
}
codeTextView.text = code;//让TextVie更新
}
//每打五位电码调用一次,检查这个句子是否被打完
private void CompleteChecker()
{
Sentence temp = null;//目前在打的句子
foreach(Sentence i in sentences) if(!i.IsThisFinished()) {temp = i;break;}//找到最近的那个没有完成的句子,也就是目前在打的句子
try{
if(temp.num.Equals(tempTranslateResult))//如果这个句子的数字序列等于目前翻译出来的数字序列
{
temp.CompleteTheSentence();//说明这个句子完成了,修改它的标记
UpdateTheSentencesTextViewStates();//有句子打完了,更新一下句子的颜色状态
ClearTheInputAndTempResult();//有句子打完后,清除输入框和临时翻译结果
if(AllSentenceClearChecker()) OnAllSentenceClear();//当所有句子都打完了,触发此函数
}
}
catch(System.NullReferenceException e)
{
Debug.Log("打完了,不要再打了,往后会出错误了");
e.ToString();
}
}
//当所有句子都被打完了,执行事件,事件代码请到事件类中去编写
private void OnAllSentenceClear(){m_Event.OnCall();}
//当确认打完一句的时候调用,检查一下是否所有句子都被打完了
private bool AllSentenceClearChecker()
{
bool flag = true;//默认全部完成
foreach(Sentence temp in sentences) if(!temp.IsThisFinished()) flag = false;//检查机器里的每一个句子如果它有没完成的把标记改成flase
return flag;//返回标记
}
//译者函数。输入一串字符串在这里会对照数值记录者中的codeBook翻译没有的code会被翻译成X
//每当输入总体的长度是五的倍数的时候才会调用这个翻译函数因为每个数字单元都是5位
private void Translate(string code)
{
string result = "";
for(int i = 0; i < code.Length/5; i++)
{
string temp = code.Substring(i*5,5);
try{
result += indexRecoder.codeBook[temp];
}
catch
{
result += "X";
}
}
Debug.Log("翻译的结果是:"+result);
tempTranslateResult = result;
//开发者捷径,如果翻译结果为"..--.","864246511",直接判定为打完所有句子
if(result == "864246511") OnAllSentenceClear();
//
}
//清除检查者函数。从自身Codeing函数调用每次有新字符输入的时候就调用。
//检查输入总体中是否存在连续的八个点,有则清空当前输入的所有东西
IEnumerator ClearChecker()
{
int hasClearer = code.IndexOf(".-.-.");
if(hasClearer != -1)
{
tearAudio.Play();
Debug.Log("检查到特殊码,清除所有输入内容");
ClearTheInputAndTempResult();
//播放翻页动画
turnPagesAnimation.SetBool("IsDelete",true);
yield return new WaitForEndOfFrame();
turnPagesAnimation.SetBool("IsDelete",false);
}
}
//清除目前输入框的内容、记录中的电码和临时翻译结果。在检查到清除特殊码和打完一句的时候调用
private void ClearTheInputAndTempResult(){tempTranslateResult = "";code = "";}
}