
(*:合并了SAIPOVersion 1.修改小时候主角的图层,解决脚部穿过问题(是脚会裂开,不是图层问题) 2.为序章战场适配应有的音效 3.为序章战场适配镜头震动 4.更换开门CG为新 5.使播放CG的时候玩家无法操作 6.添加移动水缸音效 7.添加穿上行囊音效(衣服摩擦) 8.添加了开门演出对话中敲门声的音效 9.使得多态【准备出发】幕中,不再能触发镜子的对话 10.给修理电话线界面换上美术素材 11.修正航弹的碰撞体,目前太短了,头部会嵌入一部分到地底才会爆炸 12.更换投掷系统的音效为新 (*:修正了捡拾音效出现的时机 13.制作并实装新的碉堡发射动画 (*:为了适配动画,我增加了一座碉堡,也适配了闪光灯 14.修复玩家在第一关终点被卡住的问题 15.更换夜间云的贴图 16.修复了敌人的脚步声3D特性不明显的问题 (*:建议给第一个CG加上音效 (*:建议给第一关加上微弱的雨声 (*:建议给第一关查看地图加上音效 (*:建议触发老兵牺牲事件的时候加上音效 (*:建议考虑玩家回去查看牺牲的老兵的可能性 (*:建议添加碉堡发令员的音效 (*:建议添加电报机页面撕掉错误输入的音效 (*:建议添加打开电报机界面的音效 (*:建议把碉堡发令员的指挥做成动态的 (*:现在的碉堡子弹过于整齐划一,看起来十分违和,建议修改 (*:建议加上碉堡处的挡板被击动画 (*:建议给第二关的云加上视差组件 (*:建议优化以下第二关的背景枪火光,现在太虚了,没有什么实际感 (*:建议加上敌人被声音吸引后的音效(霓虹语) (*:机枪开枪音效太软了,跟在打气枪一样,建议换成更有力的 我们正在越变越好,加油!
179 lines
7.2 KiB
C#
179 lines
7.2 KiB
C#
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
|
||
,
|
||
//y,z不变
|
||
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();
|
||
}
|
||
|
||
|
||
} |