religion/Assets/Scripts/DiZang.cs
Roman 1cfe5ef4c0 任务:搭建基本的系统
1.替换和适配地藏关卡美术资源
2.编写玩家被敲钟攻击逻辑
(1.当钟抬起到落下期间,中幅度震动手柄和屏幕
(2.当撞钟能攻击到玩家,触发玩家annoying事件,当不能,且玩家正处于annoying状态,则触发玩家Outannoying事件。annoying事件中修改玩家beannoying标记,并编写减速减益状态,Outannoying事件中修改标记,并还原减益。Update中,若处于beannoying状态,则减少受击CDLeft,若CDLeft降到0以下则受击并击飞,并重置受击CDLeft。
(3.当撞钟攻击结束时玩家任然处于被干扰状态,触发玩家的脱离干扰事件
3.修改震动管理员类,新建一种无法被覆盖的震动
4.伸手的时候中幅度震动手柄和屏幕
5.修改敲钟攻击逻辑,使得敲钟时玩家无论在何处都要减速
6.手被攻击的时候中幅度震动手柄和屏幕
2021-12-15 00:07:36 +08:00

209 lines
7.3 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>
/// 地藏Boss类继承于Enemy
/// </summary>
public class DiZang : Enemy
{
// _____ _ _ _
// | __ \ | | | (_)
// | |__) | _| |__ | |_ ___
// | ___/ | | | '_ \| | |/ __|
// | | | |_| | |_) | | | (__
// |_| \__,_|_.__/|_|_|\___|
/// <summary>
/// 攻击之间的间隔时间
/// </summary>
[Header("攻击之间的间隔时间")][FoldoutGroup("地藏")]
public float timeBetweenAttacks;
/// <summary>
/// 到底在上面还是下面生成爱欲品的玩家位置Y轴的界限
/// </summary>
[Header("到底在上面还是下面生成爱欲品的玩家位置Y轴的界限")][FoldoutGroup("地藏")]
public float aiYuPinBuildLimit;
[Header("爱欲品怪物预制体")][FoldoutGroup("地藏")]
public GameObject aiYuPin;
/// <summary>
/// 场景上方的落怪点组,用来召唤爱欲品
/// </summary>
[Header("场景上方的落怪点组")][ListDrawerSettings][FoldoutGroup("地藏")]
public List<ThrowingPoint> throwingPointGroupUp;
/// <summary>
/// 场景下方的落怪点组,用来召唤爱欲品
/// </summary>
[Header("场景下方的落怪点组")][ListDrawerSettings][FoldoutGroup("地藏")]
public List<ThrowingPoint> throwingPointGroupDown;
/// <summary>
/// 使用召唤爱欲品后有多少时间的后摇
/// </summary>
[Header("使用召唤爱欲品后有多少时间的后摇")][FoldoutGroup("地藏")]
public float CallAiYuPinEndTime;
// _____ _ _
// | __ \ (_) | |
// | |__) | __ ___ ____ _| |_ ___
// | ___/ '__| \ \ / / _` | __/ _ \
// | | | | | |\ V / (_| | || __/
// |_| |_| |_| \_/ \__,_|\__\___|
private MoneyBox moneyBox;
private delegate IEnumerator Action();
private enum PlayerState{,};
private MyPlayer player;
/// <summary>
/// 本次使用的落怪点位置组
/// </summary>
[Header("本次使用的落怪点位置组")][ListDrawerSettings][FoldoutGroup("地藏")]
[SerializeField][ListDrawerSettings][ReadOnly]
private List<ThrowingPoint> throwingPointGroupUse;
private Bell myBell;
private DiZangsHadn myHand;
public VibrationManager vibrationManager;
/// <summary>
/// 现在正在敲钟攻击吗?(包括上下浮)
/// </summary>
public bool inBell = false;
// _____ _ _ ____ _
// / ____| | | | _ \ | |
// | | __ _| | | |_) | __ _ ___| | __
// | | / _` | | | _ < / _` |/ __| |/ /
// | |___| (_| | | | |_) | (_| | (__| <
// \_____\__,_|_|_|____/ \__,_|\___|_|\_\
void Start(){
Init();
}
// _ _ _
// | \ | | | |
// | \| | ___ _ __ _ __ ___ __ _| |
// | . ` |/ _ \| '__| '_ ` _ \ / _` | |
// | |\ | (_) | | | | | | | | (_| | |
// |_| \_|\___/|_| |_| |_| |_|\__,_|_|
private void Init(){
//找到组件和物体
moneyBox = FindObjectOfType<MoneyBox>();
player = FindObjectOfType<MyPlayer>();
myBell = transform.Find("钟").GetComponent<Bell>();
myHand = transform.Find("手").GetComponent<DiZangsHadn>();
vibrationManager = FindObjectOfType<VibrationManager>();
//告诉钟自己是主人
myBell.owner = this;
}
/// <summary>
/// 执行一次攻击
/// </summary>
private new IEnumerator ATK(){
//等待攻击间隔
yield return new WaitForSeconds(timeBetweenAttacks);
//决定行动
//如果有钱,则执行拿钱
if(moneyBox.hasMoney)StartCoroutine(TakeTheMoney());
else{
//否则,随机执行召唤或者敲钟
Action action =
((Random.Range(-1f,1f) > 0) ? (Action)RingTheBell : (Action)CallAiYuPin);
StartCoroutine(action());
}
// //
// yield return new WaitForEndOfFrame();
// StartCoroutine(RingTheBell());
// //
}
/// <summary>
/// 召唤爱欲品的时候Call这个
/// </summary>
private IEnumerator CallAiYuPin(){
Debug.Log("正在使用:召唤");
//确定玩家在上半边还是下半边
PlayerState playerState =
((player.transform.position.y > aiYuPinBuildLimit) ? PlayerState.: PlayerState.);
//根据玩家位置状态确定所用落怪位置组
throwingPointGroupUse =
((playerState == PlayerState.) ?
throwingPointGroupUp : throwingPointGroupDown);
//创建一个储存生成的爱欲品的列表用于使他们在一段时间后开始Seek
List<AiYuPin> aiYuPins = new List<AiYuPin>();
//遍历位置组
foreach(ThrowingPoint t in throwingPointGroupUse){
//生成一个爱欲品
AiYuPin temp =Instantiate(
aiYuPin,
t.transform.position,//在位置组中元素的位置
Quaternion.identity
).GetComponent<AiYuPin>();
//初始化爱欲品
//该状态为wander使其先保持不动
temp.state = State.wander;
//修改爱欲品面部朝向
if(t.dir.x == -1) temp.transform.rotation = Quaternion.Euler(
temp.transform.rotation.x,
-180f,
temp.transform.localScale.z
);
//根据投掷点内信息给予爱欲品投掷速度
temp.GetComponent<Rigidbody2D>().velocity = t.dir * t.strength;
//把这个爱欲品加入列表
aiYuPins.Add(temp);
}
//一段时间后使他们开始Seek
yield return new WaitForSeconds(0.8f);
foreach(AiYuPin a in aiYuPins){
a.state = State.seek;
}
//等待攻击后摇结束
yield return new WaitForSeconds(CallAiYuPinEndTime);
//发送信号,本次攻击宣告结束
ATKEnd();
}
/// <summary>
/// 敲钟的时候Call这个
/// </summary>
private IEnumerator RingTheBell(){
Debug.Log("正在使用:敲钟");
inBell = true;
StartCoroutine(vibrationManager.ShakePad(0.5f,0.2f,6f,VibrationManager.PadShakeitem.));
yield return new WaitForEndOfFrame();
myBell.ATK(player);
//开始震动屏幕
vibrationManager.BellShakeScream();
}
/// <summary>
/// 拿钱的时候Call这个
/// </summary>
private IEnumerator TakeTheMoney(){
yield return new WaitForEndOfFrame();
Debug.Log("正在使用:拿钱");
myHand.ATK();
}
// ______ _
// | ____| | |
// | |____ _____ _ __ | |_
// | __\ \ / / _ \ '_ \| __|
// | |___\ V / __/ | | | |_
// |______\_/ \___|_| |_|\__|
protected override void OnFindThePlayer(Transform target){
if(state == State.wander){
state = State.atk;
StartCoroutine(ATK());
}
}
/// <summary>
/// 攻击结束的时候触发,重新开始新一轮攻击
/// </summary>
public void ATKEnd(){StartCoroutine(ATK());inBell = false;}
}