Roman 42b2c05a02 任务:替换现有美术素材和动画、完善游戏的流程化
*合并SAIPOVer
场景【序章-家中】
1.解决非对应多态和门互动报错的Bug

场景【第一关】
1.放上天空素材
2.放上投掷物的美术素材
3.目前投掷物不会旋转,写了方法让投出的石块随着速度的方向而旋转
4.修改了动画文件的链接方式,优化操作手感
5.放置了电火花粒子系统,适配到6处断裂
6.修改屎山代码,能够自己找到的子物体为什么要public?
7.现在似乎太难了,我降低了导弹的生成频率
8.完善修完第一个电话线后的事件,使特殊的导弹没有阴影
9.将投掷行为绑定到新骨骼
10.修改地形使其匹配电报线的凹凸
11.修复了删不掉落地后的投掷物的碰撞体的Bug
12.修改了抛物线材质使其更加显眼
13.添加投掷系统动画
14.使得地雷爆炸的时候会产生一个爆炸动画
15.修复了投掷点不跟随玩家骨骼移动的Bug
2021-08-30 01:55:39 +08:00

129 lines
4.9 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;
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;
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);
animator = GetComponent<Animator>();
}
// 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()
{
//动画中调用,爆炸动画结束后删除自身和阴影
Destroy(gameObject);
}
void OnTriggerEnter2D(Collider2D other)
{
//Debug.Log(other.name);
//当玩家被炮弹击中
switch (other.tag)
{
case "Player":
//玩家被炮弹击中
break;
case "地面":
//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);//摧毁炮弹
animator.SetBool("IsBoom",true);
//Destroy(m_shadow.gameObject);
isDroping = false;
//如果自己是特殊的炮弹,则触发石头的程序段
if(amISpecal) other.GetComponent<Stone>().BeHitBySpecalShell();
break;
}
}
}