2021-07-08 19:52:46 +08:00
|
|
|
|
using System.Collections;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
public class Shell : MonoBehaviour
|
|
|
|
|
{
|
2021-08-07 01:31:29 +08:00
|
|
|
|
//炮弹类,控制轰炸区内的炮弹和炮弹的阴影🎇
|
2021-07-08 19:52:46 +08:00
|
|
|
|
// 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;
|
2021-07-08 22:58:46 +08:00
|
|
|
|
public GameObject boomObj;
|
2021-08-18 00:50:19 +08:00
|
|
|
|
public BombingArea M_BombingArea;
|
|
|
|
|
private bool amISpecal = false;//记录自己是不是特殊的的变量。特殊的炮弹才能炸烂石头。
|
2021-08-29 01:56:07 +08:00
|
|
|
|
private Animator animator;
|
|
|
|
|
private delegate float BuildAFitX(float deleta);
|
|
|
|
|
[Tooltip("请填入阴影的最大值")]
|
|
|
|
|
public float MaxShadowSize;
|
|
|
|
|
[Tooltip("请填入阴影的最小值")]
|
|
|
|
|
public float MinShadowSize;
|
2021-07-08 22:58:46 +08:00
|
|
|
|
|
2021-07-08 19:52:46 +08:00
|
|
|
|
void Start()
|
|
|
|
|
{
|
|
|
|
|
indexRecoder = FindObjectOfType<IndexRecoder>();
|
|
|
|
|
shellSpeed = indexRecoder.shellSpeed;
|
|
|
|
|
fallingTime = indexRecoder.shellFallingTime;
|
|
|
|
|
ground = GameObject.FindWithTag("地面").transform;
|
2021-08-30 01:55:39 +08:00
|
|
|
|
if(!amISpecal)//特殊炮弹不予阴影
|
|
|
|
|
{
|
|
|
|
|
m_shadow = Instantiate(shadow,//生成一片阴影
|
|
|
|
|
new Vector3(transform.position.x,//在这枚炮弹的X
|
|
|
|
|
ground.transform.position.y + //地面的Y
|
|
|
|
|
M_BombingArea.shellShadowYOffset,//加上偏移量
|
|
|
|
|
0),
|
|
|
|
|
Quaternion.identity)
|
|
|
|
|
.transform;
|
|
|
|
|
}
|
2021-07-08 19:52:46 +08:00
|
|
|
|
Invoke("Drop",fallingTime);
|
2021-08-29 01:56:07 +08:00
|
|
|
|
|
|
|
|
|
animator = GetComponent<Animator>();
|
2021-07-08 19:52:46 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update is called once per frame
|
|
|
|
|
void Update()
|
|
|
|
|
{
|
2021-08-29 01:56:07 +08:00
|
|
|
|
if(m_shadow != null) ShadowShock();
|
2021-07-08 19:52:46 +08:00
|
|
|
|
if(isDroping)
|
|
|
|
|
{
|
|
|
|
|
transform.position -= new Vector3(0,shellSpeed*Time.deltaTime,0);
|
|
|
|
|
}
|
2021-07-08 22:58:46 +08:00
|
|
|
|
|
|
|
|
|
|
2021-07-08 19:52:46 +08:00
|
|
|
|
}
|
2021-08-18 00:50:19 +08:00
|
|
|
|
public bool AmISpecal(){return amISpecal;}//外部调用,返回这个炮弹是不是特殊的
|
|
|
|
|
public void YouAreSpecal(){amISpecal = true;}//外部调用,生成炮弹时,给其标记它是特殊的。
|
|
|
|
|
|
2021-08-29 01:56:07 +08:00
|
|
|
|
//控制阴影变化的函数,每帧调用一次
|
2021-07-08 19:52:46 +08:00
|
|
|
|
private void ShadowShock()
|
|
|
|
|
{
|
2021-08-29 01:56:07 +08:00
|
|
|
|
//首先构造一个本帧变化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不变
|
2021-07-08 19:52:46 +08:00
|
|
|
|
m_shadow.localScale.y,
|
|
|
|
|
m_shadow.localScale.z);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Drop()
|
|
|
|
|
{
|
|
|
|
|
isDroping = true;
|
|
|
|
|
}
|
|
|
|
|
|
2021-08-29 01:56:07 +08:00
|
|
|
|
public void DestroySelf()
|
|
|
|
|
{
|
|
|
|
|
//动画中调用,爆炸动画结束后删除自身和阴影
|
|
|
|
|
Destroy(gameObject);
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-08 19:52:46 +08:00
|
|
|
|
void OnTriggerEnter2D(Collider2D other)
|
|
|
|
|
{
|
2021-07-18 23:58:09 +08:00
|
|
|
|
//Debug.Log(other.name);
|
2021-07-08 19:52:46 +08:00
|
|
|
|
//当玩家被炮弹击中
|
|
|
|
|
switch (other.tag)
|
|
|
|
|
{
|
|
|
|
|
case "Player":
|
|
|
|
|
//玩家被炮弹击中
|
|
|
|
|
break;
|
|
|
|
|
case "地面":
|
2021-08-29 01:56:07 +08:00
|
|
|
|
//Destroy(m_shadow.gameObject);
|
|
|
|
|
//Destroy(gameObject);
|
2021-07-08 22:58:46 +08:00
|
|
|
|
Instantiate(boomObj, new Vector2(transform.position.x, transform.position.y),Quaternion.identity);
|
2021-08-29 01:56:07 +08:00
|
|
|
|
animator.SetBool("IsBoom",true);
|
2021-08-30 01:55:39 +08:00
|
|
|
|
if(m_shadow != null) Destroy(m_shadow.gameObject);
|
2021-08-29 01:56:07 +08:00
|
|
|
|
isDroping = false;
|
2021-07-08 19:52:46 +08:00
|
|
|
|
break;
|
2021-08-18 00:50:19 +08:00
|
|
|
|
case "石头":
|
2021-08-30 01:55:39 +08:00
|
|
|
|
// Destroy(m_shadow.gameObject);
|
|
|
|
|
// Destroy(gameObject);//摧毁炮弹
|
|
|
|
|
animator.SetBool("IsBoom",true);
|
|
|
|
|
//Destroy(m_shadow.gameObject);
|
|
|
|
|
isDroping = false;
|
2021-08-18 00:50:19 +08:00
|
|
|
|
//如果自己是特殊的炮弹,则触发石头的程序段
|
|
|
|
|
if(amISpecal) other.GetComponent<Stone>().BeHitBySpecalShell();
|
|
|
|
|
break;
|
2021-09-02 02:02:32 +08:00
|
|
|
|
case "老兵":
|
|
|
|
|
animator.SetBool("IsBoom",true);
|
|
|
|
|
isDroping = false;
|
|
|
|
|
other.transform.Find("老兵").GetComponent<Animator>().SetBool("IsBoomingDead",true);//执行老兵被炸死动画
|
|
|
|
|
break;
|
2021-09-03 01:55:24 +08:00
|
|
|
|
case "电报机":
|
|
|
|
|
animator.SetBool("IsBoom",true);
|
|
|
|
|
isDroping = false;//播放爆炸动画
|
|
|
|
|
FindObjectOfType<M_Player>().GetComponent<Animator>().
|
|
|
|
|
SetBool("IsBoomDead",true);//播放玩家被炸死动画
|
|
|
|
|
FindObjectOfType<AfterCoding>().OnDeadAnimation();
|
|
|
|
|
break;
|
2021-07-08 19:52:46 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-07-08 22:58:46 +08:00
|
|
|
|
|
2021-07-08 19:52:46 +08:00
|
|
|
|
|
2021-08-29 22:08:56 +08:00
|
|
|
|
}
|