Roman 7914126975 任务:搭建基本的系统
1.编写以撒的受击逻辑
(1.利用基类的受击逻辑
(2.具有开关表示此时是否狂暴
(3.重写以撒的onBeHit
((1.当此时狂暴,能够被攻击,模仿其他怪物受击逻辑,并触发狂暴解除函数
((2.当未狂暴,虽然击中,但是无事发生
(4.完善解救男童逻辑,当有男童被解救且未处于狂暴状态,使其狂暴
(5.编写狂暴函数,当触发狂暴时:
((1.将其攻击间隔时间改为狂暴时攻击间隔
((2.修改生成鬼魂时的逻辑,使其生成时加上一个颜色向量,控制其红色通道。通常状态向量为0,狂暴状态修改向量为红色。
((3.石像开始高频率低幅度震动
(6.编写狂暴解除功能
((1.恢复攻击间隔至普通攻击间隔
((2.修改狂暴颜色向量为零向量
((3.停止石像震动

2.修改鬼魂的攻击逻辑,只有当冲撞的时候会开启碰撞体

*:修复Bug:
(1.修复鬼魂使用落雷时,无法正确找到场景内的落雷物体的问题
(2.修复被攻击时仍能继续解救男童的问题

至此,以撒的Boss逻辑基本开发完毕
至此,三个Boss的逻辑均基本开发完毕
2021-12-17 19:54:50 +08:00

106 lines
3.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using Sirenix.OdinInspector;
/// <summary>
/// 以撒鬼魂类,控制以撒攻击时出现的鬼魂
/// </summary>
public class YiSaGoust : MonoBehaviour
{
/// <summary>
/// 冲撞将消耗的时间
/// </summary>
[Header("冲撞将消耗的时间")]
public float rushTime;
private YiSa owner;
/// <summary>
/// 落雷的游戏物体
/// </summary>
[Header("落雷的游戏物体")][HideInInspector]
public GameObject lightning;
private CapsuleCollider2D capsuleCollider2D;
void Start(){
Init();
}
private void Init(){
//找到必要的组件和物体
owner = FindObjectOfType<YiSa>();
capsuleCollider2D = GetComponent<CapsuleCollider2D>();
//如果落雷没有落雷组件,则添加一个
lightning = GameObject.Find("落雷").transform.GetChild(0).gameObject;
if(!lightning.TryGetComponent<Lightning>(out Lightning t))
lightning.AddComponent<Lightning>();
}
public void RushATK(Vector2 rushDir){
//创建并执行一段冲锋的动画
capsuleCollider2D.enabled = true;
Tweener tweener = transform.DOMove(
transform.position + (Vector3)rushDir * 2,
rushTime
);
tweener.SetEase(Ease.InElastic);
//结束后,鬼魂逐渐消隐
TweenCallback action = () => {
capsuleCollider2D.enabled = false;
GetComponent<SpriteRenderer>().DOFade(0,1);
//消隐结束后删除自己
Invoke("DestroySelf",1.1f);
//宣告攻击结束
owner.ATKEnd();
};
tweener.OnStepComplete(action);
}
public void LightningATK(){
//激活落雷
lightning.SetActive(true);
//将落雷的X位置改变到鬼魂的X
lightning.transform.position = new Vector3(
transform.position.x,
lightning.transform.position.y,
lightning.transform.position.z
);
//极短的时间后关闭落雷
Invoke("TurnOffLightning",0.2f);
//宣告攻击结束
owner.ATKEnd();
//淡出鬼魂
GetComponent<SpriteRenderer>().DOFade(0,1).OnStepComplete(()=>{
//淡出结束后,删除游戏物体
Destroy(gameObject);
});
}
private void TurnOffLightning(){lightning.SetActive(false);}
private void DestroySelf(){Destroy(gameObject);}
void OnTriggerEnter2D(Collider2D other)
{
//如果创到玩家
if(other.gameObject.TryGetComponent<MyPlayer>(out MyPlayer player)){
//告诉玩家,你被攻击了
player.OnBeHit(owner.ATK,
((transform.position.x -
player.transform.position.x)
> 0) ? 1 : -1);//通过自身位置和玩家位置的比较来返回玩家本次的受击方向
}
}
private class Lightning : MonoBehaviour
{
void OnTriggerStay2D(Collider2D other){
//如果创到玩家
if(other.gameObject.TryGetComponent<MyPlayer>(out MyPlayer player)){
//告诉玩家,你被攻击了
player.OnBeHit(FindObjectOfType<YiSa>().ATK,
((transform.position.x -
player.transform.position.x)
> 0) ? 1 : -1);//通过自身位置和玩家位置的比较来返回玩家本次的受击方向
}
}
}
}