Roman 1619bedd77 任务:搭建基本的系统
1.编写基督小怪逻辑
(1.继承自爱欲品类(巡逻、发现、追踪、击飞、被击飞、死亡、转身等功能)
(2.重写Seek函数,因为爱欲品是一直Seek到玩家位置,而基督需要保留一定距离
((1.Seek时判断基督小怪与玩家的距离,同时指定一个public变量代表攻击范围。若此距离小于攻击范围,触发攻击事件,否则移动位置靠近player

(3.重写OnTouchThePlayer事件,使其与NormalEnemy一致
(4.新增攻击事件
((1.修改状态为atk
((2.创建一个基督闪电攻击器,作为预制体保存在JiDu中
((3.初始化攻击器
((4.等待攻击器触发攻击完毕信号,触发恢复事件(无语句)

(5.新增恢复事件
((1.修改状态为Seek

*:效果:依次降下指定数量的雷(触发器判定区),前一个结束后下一个才开始
2.编写攻击器逻辑,可以指定闪电道数、闪电位置间隔、两道闪电之间的间隔时间、每道闪电的持续时间、闪电的判定范围、攻击后硬直

*:整理脚本,添加注释、摘要、分层和属性特性

至此,基督小怪的逻辑开发完毕

至此,所有小怪的逻辑均开发完毕

通过导出测试

下班
2021-12-07 21:39:49 +08:00

127 lines
4.5 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 JiDu : AiYuPin
{
// _____ _ _ _
// | __ \ | | | (_)
// | |__) | _| |__ | |_ ___
// | ___/ | | | '_ \| | |/ __|
// | | | |_| | |_) | | | (__
// |_| \__,_|_.__/|_|_|\___|
/// <summary>
/// 攻击相对于自身的位置偏移量
/// </summary>
[FoldoutGroup("基督")][Header("攻击相对于自身的位置偏移量")]
public float atkPositionOffset;
/// <summary>
/// 攻击范围
/// </summary>
[FoldoutGroup("基督")][Header("攻击范围")]
public float atkRange;
/// <summary>
/// 攻击时实例化的攻击器
/// </summary>
[FoldoutGroup("基督")][Header("闪电攻击器")]
public GameObject lightningAttack;
// _____ _ _
// | __ \ (_) | |
// | |__) | __ ___ ____ _| |_ ___
// | ___/ '__| \ \ / / _` | __/ _ \
// | | | | | |\ V / (_| | || __/
// |_| |_| |_| \_/ \__,_|\__\___|
/// <summary>
/// 自身到玩家的位置
/// </summary>
[SerializeField][ReadOnly][FoldoutGroup("状态")][Header("自身到玩家的位置")]
private float distanceToPlayer;
// _____ _ _ ____ _
// / ____| | | | _ \ | |
// | | __ _| | | |_) | __ _ ___| | __
// | | / _` | | | _ < / _` |/ __| |/ /
// | |___| (_| | | | |_) | (_| | (__| <
// \_____\__,_|_|_|____/ \__,_|\___|_|\_\
void Update(){
//如果处于追踪状态则每帧执行Seek
if(state == State.seek) Seek(target);
}
// _ _ _
// | \ | | | |
// | \| | ___ _ __ _ __ ___ __ _| |
// | . ` |/ _ \| '__| '_ ` _ \ / _` | |
// | |\ | (_) | | | | | | | | (_| | |
// |_| \_|\___/|_| |_| |_| |_|\__,_|_|
/// <summary>
/// 如果处于Seek状态则每帧执行一次
/// </summary>
/// <param name="target">追踪目标</param>
protected override void Seek(Transform target){
//计算自己与玩家的距离
distanceToPlayer = Mathf.Abs(target.position.x - transform.position.x);
//如果距离小于攻击范围,则发动攻击
if(distanceToPlayer < atkRange)Atk();
//否则执行爱欲品的Seek移动追向目标
else base.Seek(target);
}
/// <summary>
/// 攻击的时候触发
/// </summary>
private void Atk(){
//修改自身状态至攻击
state = State.atk;
//判定一下自身和玩家的位置,确定攻击方向
int atkDir = ((target.position.x - transform.position.x > 0) ? 1:-1);
//生成一个攻击器预制体并根据攻击方向给予X轴偏移
LightningAttackAdministrator l = Instantiate(
lightningAttack,
new Vector3(
transform.position.x + atkPositionOffset * atkDir,
transform.position.y,
transform.position.z
),
Quaternion.identity
).GetComponent<LightningAttackAdministrator>();
//初始化一下攻击器,给予攻击器主人和方向😍
l.owner = this;
l.dir = atkDir;
}
// ______ _
// | ____| | |
// | |____ _____ _ __ | |_
// | __\ \ / / _ \ '_ \| __|
// | |___\ V / __/ | | | |_
// |______\_/ \___|_| |_|\__|
/// <summary>
/// 碰到玩家的时候触发。对于基督小怪来说,玩家碰到它会收到伤害,与继承到的爱欲品不同,但与爱欲品继承的相同,所以返回到父类的父类执行
/// 我超不能base.base老老实实抄一遍代码吧
/// </summary>
/// <param name="player">玩家</param>
protected override void OnTouchThePlayer(MyPlayer player){
//告诉玩家,你被攻击了
player.OnBeHit(ATK,
((transform.position.x -
player.transform.position.x)
> 0) ? 1 : -1);//通过自身位置和玩家位置的比较来返回玩家本次的受击方向
}
/// <summary>
/// 当攻击器攻击结束Call这个把状态恢复至Seek
/// </summary>
public void OnAtkEnd(){state = State.seek;}
}