religion/Assets/Scripts/YiSiLan.cs
Roman 9b4871b128 任务:搭建基本的系统
1.完成召唤炸弹攻击逻辑
(1.参照其他两种攻击,延时循环3次
(2.在起点和终点之间的x范围内的随机位置生成炸弹,y轴绑定起点

(*.修改炸弹类,使其右变量控制落地后的爆炸时间,默认为0,初始化时可以更改。新增判断,如果落地,执行延时而非直接爆炸

(3.初始化炸弹,给其向下微微偏左的初速度,这种炸弹会滚动,修改其落地后爆炸的时间

2.完成反击炸弹逻辑
(1.给玩家添加子物体:反击侦察器,内含圆形触发器
(2.给MyPlayer添加工具类,反击侦察器,初始化的时候找到该子物体并赋予其组件
(3.编写反击侦察器逻辑,内含一对触发器逻辑,当有炸弹进入反击范围,记录可反击炸弹,离开则清空
(4.编写玩家反击判定。当按下攻击键,额外检查反击侦察器是否有炸弹可以反击,如果有,再检查面部朝向,只有面朝左侧,也就是面朝木马,才能则执行反击

3.完成木马的被打断逻辑
(1.被炸事件触发时修改自身标记被打断
(2.若处于被打断状态,break出喷射循环,呼叫攻击结束事件

4.修复炸弹捕捉攻击对象错误Bug

5.木马创到人的时候,让人受伤

6.添加一些手柄震动
(1.当成功反弹炸弹,剧烈震动手柄

至此,伊斯兰Boss关的逻辑基本开发完毕

7.搭建基督Boss关测试场景
(1.加入一些必要元素
2021-12-14 01:33:24 +08:00

195 lines
7.1 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 Sirenix.OdinInspector;
/// <summary>
/// 伊斯兰小怪类
/// </summary>
public class YiSiLan : Enemy, Boomer.I_CanBeBoomedObj
{
// _____ _ _ _
// | __ \ | | | (_)
// | |__) | _| |__ | |_ ___
// | ___/ | | | '_ \| | |/ __|
// | | | |_| | |_) | | | (__
// |_| \__,_|_.__/|_|_|\___|
[FoldoutGroup("其他",false,0)][Header("怪物死后旋转速度的随机区间")]
public float deadRotationRangeMax;
[FoldoutGroup("其他",false,0)]
public float deadRotationRangeMin;
/// <summary>
/// 抓到玩家后多长事件触发爆炸
/// </summary>
[Header("抓到玩家后多长事件触发爆炸")][FoldoutGroup("伊斯兰")]
public float boomTime;
/// <summary>
/// 被击飞力度的调整值
/// </summary>
[Header("被攻击后击飞的力度调整值")][FoldoutGroup("其他",false,0)]
public Vector2 hitToflyParameter;
// _____ _ _
// | __ \ (_) | |
// | |__) | __ ___ ____ _| |_ ___
// | ___/ '__| \ \ / / _` | __/ _ \
// | | | | | |\ V / (_| | || __/
// |_| |_| |_| \_/ \__,_|\__\___|
private Rigidbody2D m_rigidbody;
/// <summary>
/// seek函数中的追踪目标
/// </summary>
private Transform target;
/// <summary>
/// 记录此时玩家是否在爆炸范围内
/// </summary>
[Header("记录此时玩家是否在爆炸范围内")][SerializeField][FoldoutGroup("伊斯兰")][ReadOnly]
private bool canHitPlayer;
// _____ _ _ ____ _
// / ____| | | | _ \ | |
// | | __ _| | | |_) | __ _ ___| | __
// | | / _` | | | _ < / _` |/ __| |/ /
// | |___| (_| | | | |_) | (_| | (__| <
// \_____\__,_|_|_|____/ \__,_|\___|_|\_\
void Start(){Init();}//初始化
void FixedUpdate(){if(state == State.seek)Seek();}//seek
// _ _ _
// | \ | | | |
// | \| | ___ _ __ _ __ ___ __ _| |
// | . ` |/ _ \| '__| '_ ` _ \ / _` | |
// | |\ | (_) | | | | | | | | (_| | |
// |_| \_|\___/|_| |_| |_| |_|\__,_|_|
private void Init(){
//初始化状态为Seek
state = State.seek;
//找到必要的组件
m_rigidbody = GetComponent<Rigidbody2D>();
target = FindObjectOfType<MyPlayer>().transform;
}
/// <summary>
/// 寻找函数每Fixed调用
/// </summary>
private void Seek(){
//构造一个方向1代表向右-1代表向左
int dir = (target.position.x - transform.position.x > 0) ? 1:-1;
//使刚体水平方向上获得速度
m_rigidbody.velocity = new Vector2(speed * dir,
m_rigidbody.velocity.y);
//矫正一下faceDir的问题,使其始终朝向玩家
transform.rotation = Quaternion.
Euler
(transform.rotation.x,
((dir == 1) ? 0:-180),
transform.rotation.z);
}
/// <summary>
/// 碰到玩家的时候触发,伊斯兰爆炸的时候Call这个通过协程触发因为爆炸有个延时
/// </summary>
private void Boom(){
//
deadRotationRangeMax *= 3;
deadRotationRangeMin *= 3;
hitToflyParameter *= 3;
state = State.dead;
OnBeHit(MyPlayer.AtkMethod.,(target.position.x - transform.position.x > 0) ? 1:-1);
// //让自己去世
// OnDead();
//判定能否攻击到玩家
if(canHitPlayer){
FindObjectOfType<MyPlayer>().OnBeHit(ATK,(target.position.x - transform.position.x > 0) ? -1:1);
// //加一个扭矩,营造死亡的效果
// m_rigidbody.AddTorque(Random.Range(deadRotationRangeMin,deadRotationRangeMax) *
// ((target.position.x - transform.position.x > 0) ? -1:1));
}
}
/// <summary>
/// 被击飞的击飞效果处理
/// </summary>
/// <param name="dir">被击方向</param>
public void BeHitToFly(int dir){
m_rigidbody.velocity += new Vector2( //给予自身一个
-1 * dir * hitToflyParameter.x,//X方向为力度系数乘以受击方向
hitToflyParameter.y//Y方向为力度系数
//的绝对的速度
);
}
/// <summary>
/// 协程用,删除自己这个游戏物体
/// </summary>
protected void Dead(){Destroy(gameObject);}
// ______ _
// | ____| | |
// | |____ _____ _ __ | |_
// | __\ \ / / _ \ '_ \| __|
// | |___\ V / __/ | | | |_
// |______\_/ \___|_| |_|\__|
protected override void OnTouchThePlayer(MyPlayer player){Invoke("Boom",boomTime);}
protected override void OnDead(){
//标记当前状态为死亡
state = State.dead;
//加一个扭矩,营造死亡的效果
m_rigidbody.AddTorque(Random.Range(deadRotationRangeMin,deadRotationRangeMax) *
((target.position.x - transform.position.x > 0) ? -1 : 1));
//关掉自己的碰撞体
GetComponent<BoxCollider2D>().enabled = false;
//两秒后自己毁灭
Invoke("Dead",2f);
}
public override void OnBeHit(MyPlayer.AtkMethod hitMethod, int hitDir){
//让自己被击飞
BeHitToFly(hitDir);
//结算生命值
HPLeft -= MyPlayer.atkMethodMagnification[hitMethod];
//看下死了没
//死了就记录下死亡时候的面部朝向用来做死亡翻滚效果然后再Call一下死亡事件
if(CheckDead()) {OnDead();}
//被打飞了在着地前都不会挨打了
canBeHit = false;
}
// _____ _ _ _ _
// / ____| | | (_) (_)
// | | ___ | | |_ ___ _ ___ _ __
// | | / _ \| | | / __| |/ _ \| '_ \
// | |___| (_) | | | \__ \ | (_) | | | |
// \_____\___/|_|_|_|___/_|\___/|_| |_|
//触发器代表炸弹范围,进入说明能炸到,离开说明炸不到了
protected override void OnTriggerEnter2D(Collider2D other){
base.OnTriggerEnter2D(other);
if(other.gameObject.TryGetComponent<MyPlayer>(out MyPlayer player))
canHitPlayer = true;
}
void OnTriggerExit2D(Collider2D other){
if(other.gameObject.TryGetComponent<MyPlayer>(out MyPlayer player))
canHitPlayer = false;
}
// _____ _ __
// |_ _| | | / _|
// | | _ __ | |_ ___ _ __| |_ __ _ ___ ___
// | | | '_ \| __/ _ \ '__| _/ _` |/ __/ _ \
// _| |_| | | | || __/ | | || (_| | (_| __/
// |_____|_| |_|\__\___|_| |_| \__,_|\___\___|
public void BeBoomed(float atk, int dir, Boomer boomer){
//需要重写
OnBeHit(MyPlayer.AtkMethod.,dir);
}
public Transform ObjTransform(){return transform;}
}