Roman cae653bda3 任务:实装和完善部分音效,修复场景问题
(*:合并了SAIPOVersion
1.修改小时候主角的图层,解决脚部穿过问题(是脚会裂开,不是图层问题)
2.为序章战场适配应有的音效
3.为序章战场适配镜头震动
4.更换开门CG为新
5.使播放CG的时候玩家无法操作
6.添加移动水缸音效
7.添加穿上行囊音效(衣服摩擦)
8.添加了开门演出对话中敲门声的音效
9.使得多态【准备出发】幕中,不再能触发镜子的对话
10.给修理电话线界面换上美术素材
11.修正航弹的碰撞体,目前太短了,头部会嵌入一部分到地底才会爆炸
12.更换投掷系统的音效为新
(*:修正了捡拾音效出现的时机
13.制作并实装新的碉堡发射动画
(*:为了适配动画,我增加了一座碉堡,也适配了闪光灯
14.修复玩家在第一关终点被卡住的问题
15.更换夜间云的贴图
16.修复了敌人的脚步声3D特性不明显的问题

(*:建议给第一个CG加上音效
(*:建议给第一关加上微弱的雨声
(*:建议给第一关查看地图加上音效
(*:建议触发老兵牺牲事件的时候加上音效
(*:建议考虑玩家回去查看牺牲的老兵的可能性
(*:建议添加碉堡发令员的音效
(*:建议添加电报机页面撕掉错误输入的音效
(*:建议添加打开电报机界面的音效
(*:建议把碉堡发令员的指挥做成动态的
(*:现在的碉堡子弹过于整齐划一,看起来十分违和,建议修改
(*:建议加上碉堡处的挡板被击动画
(*:建议给第二关的云加上视差组件
(*:建议优化以下第二关的背景枪火光,现在太虚了,没有什么实际感
(*:建议加上敌人被声音吸引后的音效(霓虹语)
(*:机枪开枪音效太软了,跟在打气枪一样,建议换成更有力的

我们正在越变越好,加油!
2021-09-10 01:20:36 +08:00

179 lines
7.2 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 Cinemachine;
public class Shell : MonoBehaviour
{
//炮弹类,控制轰炸区内的炮弹和炮弹的阴影🎇
// Start is called before the first frame update
public GameObject shadow;//阴影游戏物体
private Transform ground;//地面的位置信息
private float shellSpeed;//炮弹速度
private IndexRecoder indexRecoder;
private float fallingTime;
private bool isDroping = false;
private Transform m_shadow;
public GameObject boomObj;
public BombingArea M_BombingArea;
private bool amISpecal = false;//记录自己是不是特殊的的变量。特殊的炮弹才能炸烂石头。
private Animator animator;
private delegate float BuildAFitX(float deleta);
[Tooltip("请填入阴影的最大值")]
public float MaxShadowSize;
[Tooltip("请填入阴影的最小值")]
public float MinShadowSize;
public Animator target;//如果是特殊炮弹则有targe这个变量当这个炮弹爆炸触发目标的死亡动画
public AudioSource boomAudio;//航弹爆炸音效
public GameObject boomLight;//航弹爆炸光效
private CinemachineImpulseSource impulseSource;//镜头震动呼出者
void Start()
{
indexRecoder = FindObjectOfType<IndexRecoder>();
shellSpeed = indexRecoder.shellSpeed;
fallingTime = indexRecoder.shellFallingTime;
ground = GameObject.FindWithTag("地面").transform;
if(!amISpecal)//特殊炮弹不予阴影
{
m_shadow = Instantiate(shadow,//生成一片阴影
new Vector3(transform.position.x,//在这枚炮弹的X
ground.transform.position.y + //地面的Y
M_BombingArea.shellShadowYOffset,//加上偏移量
0),
Quaternion.identity)
.transform;
}
Invoke("Drop",fallingTime);
Invoke("DestroySelf",10f);
animator = GetComponent<Animator>();
impulseSource = GetComponent<CinemachineImpulseSource>();
}
// Update is called once per frame
void Update()
{
if(m_shadow != null) ShadowShock();
if(isDroping)
{
transform.position -= new Vector3(0,shellSpeed*Time.deltaTime,0);
}
}
public bool AmISpecal(){return amISpecal;}//外部调用,返回这个炮弹是不是特殊的
public void YouAreSpecal(){amISpecal = true;}//外部调用,生成炮弹时,给其标记它是特殊的。
//控制阴影变化的函数,每帧调用一次
private void ShadowShock()
{
//首先构造一个本帧变化x
BuildAFitX buildAFitX = (float deleta)
=>
{
float newX = m_shadow.transform.localScale.x + deleta;
if(newX > MinShadowSize && newX < MaxShadowSize)
{return newX;}
else return m_shadow.transform.localScale.x;
};
float x = buildAFitX(Random.Range(-indexRecoder.shellShadowRangeOfChange,
indexRecoder.shellShadowRangeOfChange));
//使得本地大小改变为
m_shadow.transform.localScale = new Vector3(
//x
// m_shadow.localScale.x +
// Random.Range(-indexRecoder.shellShadowRangeOfChange,
// indexRecoder.shellShadowRangeOfChange),
x
,
//yz不变
m_shadow.localScale.y,
m_shadow.localScale.z);
}
private void Drop()
{
isDroping = true;
}
public void DestroySelf()
{
//动画中调用,爆炸动画结束后删除自身和阴影
//由于音效需要,等炮弹动画结束后两秒才销毁物体
Invoke("DestoryInvoke",2f);
//销毁前还会存在一段时间。所以要关闭自身的触发器和图片
GetComponent<BoxCollider2D>().enabled = false;
GetComponent<SpriteRenderer>().enabled = false;
//还得把灯关了
boomLight.SetActive(false);
}
private void DestoryInvoke()
{
Destroy(gameObject);
}
void OnTriggerEnter2D(Collider2D other)
{
//Debug.Log(other.name);
//当炮弹爆炸根据目标物体的tag分化
switch (other.tag)
{
case "Player":
//玩家被炮弹击中
Debug.Log("玩家被炮弹击中");
break;
case "地面":
boomAudio.Play();
boomLight.SetActive(true);
//Destroy(m_shadow.gameObject);
//Destroy(gameObject);
Instantiate(boomObj, new Vector2(transform.position.x, transform.position.y),Quaternion.identity);
animator.SetBool("IsBoom",true);
if(m_shadow != null) Destroy(m_shadow.gameObject);
isDroping = false;
break;
case "石头":
// Destroy(m_shadow.gameObject);
// Destroy(gameObject);//摧毁炮弹
boomAudio.Play();
boomLight.SetActive(true);
animator.SetBool("IsBoom",true);
//Destroy(m_shadow.gameObject);
isDroping = false;
//如果自己是特殊的炮弹,则触发石头的程序段
if(amISpecal) other.GetComponent<Stone>().BeHitBySpecalShell();
break;
case "老兵":
animator.SetBool("IsBoom",true);
boomAudio.Play();
boomLight.SetActive(true);
isDroping = false;
other.transform.Find("老兵").GetComponent<Animator>().SetBool("IsBoomDead",true);//执行老兵被炸死动画
break;
// case "电报机":
// animator.SetBool("IsBoom",true);
// isDroping = false;//播放爆炸动画
// FindObjectOfType<M_Player>().GetComponent<Animator>().
// SetBool("IsBoomDead",true);//播放玩家被炸死动画
// FindObjectOfType<AfterCoding>().OnDeadAnimation();
// break;
case "爆炸点":
boomAudio.Play();
boomLight.SetActive(true);
animator.SetBool("IsBoom",true);
isDroping = false;//播放爆炸动画
FindObjectOfType<AfterCoding>().OnDeadAnimation();
break;
}
if(amISpecal) //如果自己是特殊炸弹,则要考虑触发目标的死亡动画
{
if(target!=null)target.SetBool("IsBoomDead",true);
}
impulseSource.GenerateImpulse();
}
}