Roman eb0649bc20 任务:制作UI
1.制作玩家UI
(1.制作玩家血条UI
((1.作为一个独立的Canvas物体
((2.当检查到记录中血量和真实剩余血量不一样,重刷新血量UI
((3.保存子物体列表,一共10个爱心
((4.保存两张UI图片
((5.当触发重刷新UI,遍历10个爱心,把前Left个数的爱心换成红色,其他的换成白色
((6.将血条UI放置到每一个场景
(2.制作镰刀CDUI
((1.初始化时,获取玩家镰刀CD总时长
((2.当玩家发射镰刀,额外让玩家找到UI组件,并发送信号,触发Tween动画,以圆圈形式从0到1重显现CDUI
((3.适配到每一个场景

2.制作boss血条
(1.逻辑基本上与玩家的一致
(2.额外增加一个boss名字文字栏
(3.当Boss进入攻击状态,开始显示血条和名字

*优化和修复
1.镰刀攻击同时按卡动画
2.修复读板时按确定会出错的问题
3.修复疯狂发射镰刀会卡动画的问题
4.修复玩家死后着地会滑动的问题
5.修复了未开启开幕演出,死亡后报错的问题
6.修复各个场景玩家UI和专场块的遮挡问题

下班
2021-12-27 00:07:25 +08:00

239 lines
8.2 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;
using DG.Tweening;
/// <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;
//初始化生命值
HPLeft = HP;
}
/// <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 / __/ | | | |_
// |______\_/ \___|_| |_|\__|
public override void OnFindThePlayer(Transform target){
if(state == State.wander){
state = State.atk;
StartCoroutine(ATK());
//开始显示血条UI
FindObjectOfType<BossHPBar>().OnShowUI();
}
}
/// <summary>
/// 攻击结束的时候触发,重新开始新一轮攻击
/// </summary>
public void ATKEnd(){
if(state == State.atk){
StartCoroutine(ATK());inBell = false;
}
}
public override void OnDead(){
//修改状态至死亡
state = State.dead;
//播放死亡动画
GetComponent<Animator>().SetBool("isDead",true);
//令钟猛地上浮
myBell.DOKill();
myBell.floatTweener.Kill();
myBell.transform.DOLocalMoveY(
8f,
1f
);
//开启转移块
FindObjectOfType<Transfer>().GetComponent<BoxCollider2D>().enabled = true;
//上传玩家进度
FindObjectOfType<PlayerInfo>().rate = (int) MyPlayer.Progress.;
FindObjectOfType<PlayerInfo>().UpdatePlayerInfo();
}
}