فهرست منبع

behittrigger对于闪白功能新增try-catch;boss的一些技能更新

SZAND\msx_2 3 ماه پیش
والد
کامیت
88b327449d

+ 9 - 3
ActionTowerDefense/Assets/Resources/Prefab/Boss/WaterSprite/Boss_Braid.prefab

@@ -701,10 +701,16 @@ MonoBehaviour:
     attacks: []
   OnWaterPosY: 0
   aimPos: {x: 0, y: 0, z: 0}
-  minHeight: -2
-  maxHeight: 4
-  minLength: 4
+  maxHeight1: 0
+  maxHeight2: 0
+  minLength: -0.52
   maxLength: 8
+  singleJumpTime: 0
+  hitWaterTime: 0
+  upSpeed: 0
+  isHitWater: 0
+  minJumpCount: 0
+  maxJumpCount: 0
 --- !u!114 &3023217533601715770
 MonoBehaviour:
   m_ObjectHideFlags: 0

+ 36 - 7
ActionTowerDefense/Assets/Resources/Spine/Boss_braid/Boss_braid_SkeletonData_Controller.controller

@@ -836,6 +836,32 @@ AnimatorStateTransition:
   m_InterruptionSource: 0
   m_OrderedInterruption: 1
   m_CanTransitionToSelf: 1
+--- !u!1102 &-4936188104067422683
+AnimatorState:
+  serializedVersion: 6
+  m_ObjectHideFlags: 1
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_Name: move_rise
+  m_Speed: 1
+  m_CycleOffset: 0
+  m_Transitions: []
+  m_StateMachineBehaviours: []
+  m_Position: {x: 50, y: 50, z: 0}
+  m_IKOnFeet: 0
+  m_WriteDefaultValues: 1
+  m_Mirror: 0
+  m_SpeedParameterActive: 0
+  m_MirrorParameterActive: 0
+  m_CycleOffsetParameterActive: 0
+  m_TimeParameterActive: 0
+  m_Motion: {fileID: 5357233557887567433}
+  m_Tag: 
+  m_SpeedParameter: 
+  m_MirrorParameter: 
+  m_CycleOffsetParameter: 
+  m_TimeParameter: 
 --- !u!1102 &-3067777464722279042
 AnimatorState:
   serializedVersion: 6
@@ -888,14 +914,14 @@ AnimatorState:
   m_MirrorParameter: 
   m_CycleOffsetParameter: 
   m_TimeParameter: 
---- !u!1102 &-2378318940295759834
+--- !u!1102 &-2319556735364185202
 AnimatorState:
   serializedVersion: 6
   m_ObjectHideFlags: 1
   m_CorrespondingSourceObject: {fileID: 0}
   m_PrefabInstance: {fileID: 0}
   m_PrefabAsset: {fileID: 0}
-  m_Name: move
+  m_Name: move_fall
   m_Speed: 1
   m_CycleOffset: 0
   m_Transitions: []
@@ -908,7 +934,7 @@ AnimatorState:
   m_MirrorParameterActive: 0
   m_CycleOffsetParameterActive: 0
   m_TimeParameterActive: 0
-  m_Motion: {fileID: 0}
+  m_Motion: {fileID: -2300885850533815735}
   m_Tag: 
   m_SpeedParameter: 
   m_MirrorParameter: 
@@ -1836,12 +1862,9 @@ AnimatorStateMachine:
   - serializedVersion: 1
     m_State: {fileID: -3067777464722279042}
     m_Position: {x: 480, y: 520, z: 0}
-  - serializedVersion: 1
-    m_State: {fileID: -2378318940295759834}
-    m_Position: {x: 515, y: 585, z: 0}
   - serializedVersion: 1
     m_State: {fileID: -1953351472425474637}
-    m_Position: {x: 550, y: 650, z: 0}
+    m_Position: {x: 550, y: 660, z: 0}
   - serializedVersion: 1
     m_State: {fileID: -6798333593589032740}
     m_Position: {x: 790, y: 530, z: 0}
@@ -1854,6 +1877,12 @@ AnimatorStateMachine:
   - serializedVersion: 1
     m_State: {fileID: 5561397459556167838}
     m_Position: {x: 140, y: 500, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: -4936188104067422683}
+    m_Position: {x: 487.6819, y: 606.5933, z: 0}
+  - serializedVersion: 1
+    m_State: {fileID: -2319556735364185202}
+    m_Position: {x: 720, y: 610, z: 0}
   m_ChildStateMachines: []
   m_AnyStateTransitions: []
   m_EntryTransitions: []

+ 44 - 3
ActionTowerDefense/Assets/Scripts/Boss/Boss.cs

@@ -4,6 +4,7 @@ using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using TMPro;
+using Sirenix.OdinInspector;
 
 public enum AttackState
 {
@@ -42,6 +43,18 @@ public class Boss : MoveCharacter
     public float minInterval, maxInterval;  //间隔时间
     private float curInterval;
 
+    [Header("转阶段")]
+    [LabelText("boss的独立空间")]
+    public GameObject newBG;
+    [LabelText("切换到boss空间的血量扣除值")]
+    public float toBossNeedHP;
+    [LabelText("切换到boss空间的次数")]
+    public float toBossTime;
+    [LabelText("切换回原空间所需的时间")]
+    public float toOrigNeedTime;
+    [LabelText("切换到原空间所需的血量")]
+    public float toOrigNeedHP;
+
     public override void Init()
     {
         //确保组件不丢失
@@ -50,14 +63,14 @@ public class Boss : MoveCharacter
             ani = GetComponentInChildren<Animator>();
         }
 
+        //玩家
+        pc = PlayersInput.instance[0];
+
         //血量重置
         hp = totalHp;
         uiHp.Show(hp, totalHp);
         ChangeState(CharacterState.Idle);
         curInterval = Random.Range(minInterval, maxInterval);
-
-        //玩家
-        pc = PlayersInput.instance[0];
     }
 
     public virtual void Start()
@@ -236,4 +249,32 @@ public class Boss : MoveCharacter
         }
         return weight.Length - 1;
     }
+
+    //切换背景
+    private void ChangeBG(bool isToBossBG)
+    {
+        if (isToBossBG)
+        {
+            newBG.SetActive(true);
+            GameManager.instance.chapterBG.SetActive(false);
+        }
+        else
+        {
+            newBG.SetActive(false);
+            GameManager.instance.chapterBG.SetActive(true);
+        }
+        pc.foot.trigGroundList.Clear();
+    }
+
+    bool use = true;
+
+    public override void Update()
+    {
+        base.Update();
+        if (Input.GetKeyDown(KeyCode.Q))
+        {
+            ChangeBG(use);
+            use = !use;
+        }
+    }
 }

+ 19 - 6
ActionTowerDefense/Assets/Scripts/Boss/WaterGhost/BlackUmbrella.cs

@@ -56,6 +56,9 @@ public class BlackUmbrella : MonoBehaviour
     [LabelText("黑伞消失时长")]
     public float disappearTime;
 
+    //是第一次攻击,则无需索敌
+    private bool isFirst;
+
     private void Start()
     {
         if (ani == null)
@@ -73,6 +76,7 @@ public class BlackUmbrella : MonoBehaviour
     public void Release()
     {
         allTime = Random.Range(minTime, maxTime);
+        isFirst = true;
         ChangeUmbrellaState(UmbrellaState.appear);
     }
 
@@ -92,14 +96,23 @@ public class BlackUmbrella : MonoBehaviour
             case UmbrellaState.sprint:
                 origPos = transform.position;
                 aimPos = pc.transform.position;
-                aimPos.y = origPos.y;
-                int fx = 1;
-                if (aimPos.x < origPos.x)
+                if (isFirst && aimPos.x < transform.position.x)
+                {
+                    aimPos = transform.position + new Vector3(1, 0, 0) * farFromPlayerDis;
+                    attackDis = farFromPlayerDis;
+                    isFirst = false;
+                }
+                else
                 {
-                    fx = -1;
+                    aimPos.y = origPos.y;
+                    int fx = 1;
+                    if (aimPos.x < origPos.x)
+                    {
+                        fx = -1;
+                    }
+                    aimPos.x += farFromPlayerDis * fx;
+                    attackDis = Mathf.Abs(aimPos.x - transform.position.x);
                 }
-                aimPos.x += farFromPlayerDis * fx;
-                attackDis = Mathf.Abs(aimPos.x - transform.position.x);
                 break;
             case UmbrellaState.stay:
                 aimPos.y = pc.bodyTrans.position.y;

+ 158 - 25
ActionTowerDefense/Assets/Scripts/Boss/WaterGhost/WaterSprite.cs

@@ -14,6 +14,14 @@ public class WaterSprite : Boss
         Rush,       //水面冲刺
     }
 
+    public enum JumpMoveState
+    {
+        none,
+        rise,
+        fall,
+        back,
+    }
+
     [System.Serializable]
     public struct AttackAssignment
     {
@@ -35,14 +43,40 @@ public class WaterSprite : Boss
     private AttackMethods curAttackType;
     private WaterSpriteAttackController attack;
 
+    [Header("boss初始y轴")]
+    public float minIdleY;
+    public float maxIdleY;
+    private float idleY;
+
     [LabelText("站在水面时的y轴")]
     public float OnWaterPosY;
 
     [Header("移动")]
+    private bool hasFirst;
+    [LabelText("最终目标(玩家坐标)")]
     public Vector3 aimPos;
-    public float minHeight, maxHeight;
+    //跳跃初速度
+    public float minUpSpeed, maxUpSpeed;
+    private float upSpeed;
+    private Vector3 curVel;
+    //下落重力
+    private float gravity;
+    //移动距离什么的
     public float minLength, maxLength;
-    private float nowAimX;                  //现在要落在水面的x轴
+    private float horiDis;
+    //现在要落在水面的坐标
+    private Vector3 nowAim;
+    private Vector3 dir;
+    //单次跳跃动作的时长
+    [LabelText("仅rise动作/fall动作")]
+    public float singleJumpTime;
+    private JumpMoveState jumpState;
+    [HideInInspector]
+    public bool isHitWater;
+    private float jumpTime;
+    //跳跃次数
+    private int jumpCount;
+    public int minJumpCount, maxJumpCount;
 
     public override void Init()
     {
@@ -51,9 +85,9 @@ public class WaterSprite : Boss
     }
 
     //下一步移动位置
-    private float GetAimPos()
+    private Vector3 GetAimPos()
     {
-        float aimX = aimPos.x;
+        Vector3 aim = aimPos;
         float dis = transform.position.x - aimPos.x;
         int fx = 1;
         if (dis > 0)
@@ -67,12 +101,12 @@ public class WaterSprite : Boss
         //和目标位置的距离 小于 最低移动距离时,移动到目标位置
         if (dis < minLength)
         {
-            aimX = aimPos.x;
+            aim.x = aimPos.x;
         }
         //和目标位置的距离 小于 最低移动距离的两倍时,移动最低移动距离
         else if (dis < minLength * 2)
         {
-            aimX = transform.position.x + minLength * fx;
+            aim.x = transform.position.x + minLength * fx;
         }
         //在移动距离阈值内随机
         else
@@ -83,58 +117,157 @@ public class WaterSprite : Boss
             {
                 maxX = dis - minLength;
             }
-            aimX = transform.position.x + Random.Range(minLength, maxX) * fx;
+            float k = Random.Range(minLength, maxX) * fx;
+            aim.x = transform.position.x + k;
         }
-        return aimX;
+        aim.y = OnWaterPosY;
+        return aim;
     }
 
     //步步生花
-    private void SingleMove(Vector3 aimPos)
+    public override void ToMove()
     {
-        
+        ToJumpMove(JumpMoveState.rise);
     }
 
-    public override void ToMove()
+    public override void OnMove()
     {
-        ani.Play("move");
-        
+        OnJumpMove();
     }
 
-    public override void OnMove()
+    //升到最高点→播动画,降到最低点→面试成功
+    private void ToJumpMove(JumpMoveState jms)
+    {
+        if (jms == jumpState)
+        {
+            return;
+        }
+        jumpState = jms;
+        switch (jumpState)
+        {
+            case JumpMoveState.rise:
+                //计算落点
+                jumpTime = 0;
+                aimPos = pc.bodyTrans.position;
+                nowAim = GetAimPos();
+                //水平速度
+                horiDis = Mathf.Abs(nowAim.x - transform.position.x);
+                float horVel = horiDis / singleJumpTime;
+                //水平方向
+                dir = Vector3.zero;
+                dir.x = nowAim.x - transform.position.x;
+                dir = dir.normalized;
+                //随机初速度
+                upSpeed = Random.Range(minUpSpeed, maxUpSpeed);
+                gravity = 2f * upSpeed / singleJumpTime;      //初始垂直速度,t=2*v0/g => g=2*v0/t          
+                curVel = dir * horVel + Vector3.up * upSpeed;       //初始速度
+                if (!hasFirst)
+                {
+                    hasFirst = true;
+                }
+                else
+                {
+                    ani.Play("move_rise", 0, 0);
+                }
+                break;
+            case JumpMoveState.fall:
+                ani.Play("move_fall", 0, 0);
+                jumpTime = 0;
+                break;
+            case JumpMoveState.none:
+                EndCurAttackState(true);
+                hasFirst = false;
+                break;
+            case JumpMoveState.back:
+                idleY = Random.Range(minIdleY, maxIdleY);
+                float useTime = (idleY - OnWaterPosY) / upSpeed;
+                ani.speed = singleJumpTime / useTime;
+                ani.Play("move_rise", 0, 0);
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void OnJumpMove()
     {
-        if (Mathf.Abs(transform.position.x - nowAimX) <= 0.2f)
+        switch (jumpState)
         {
-            ToMove();
+            //向上升到某高度
+            case JumpMoveState.rise:
+                curVel += Vector3.down * gravity * Time.deltaTime;
+                transform.position += curVel * Time.deltaTime;
+                jumpTime += Time.deltaTime;
+                if (jumpTime >= 1 && curVel.y <= 0)
+                {
+                    ToJumpMove(JumpMoveState.fall);
+                }
+                break;
+            case JumpMoveState.fall:
+                curVel += Vector3.down * gravity * Time.deltaTime;
+                transform.position += curVel * Time.deltaTime;
+                if (transform.position.y <= OnWaterPosY + 0.02f)
+                {
+                    transform.position = nowAim;
+                    jumpCount--;
+                    if (jumpCount > 0)
+                    {
+                        ToJumpMove(JumpMoveState.rise);
+                    }
+                    else
+                    {
+                        ToJumpMove(JumpMoveState.back);
+                    }
+                }
+                break;
+            case JumpMoveState.back:
+                transform.position += new Vector3(0, 1, 0) * upSpeed * Time.deltaTime;
+                if (transform.position.y >= idleY - 0.02f)
+                {
+                    Vector3 vec = transform.position;
+                    vec.y = idleY;
+                    transform.position = vec;
+                    ani.speed = 1;
+                    ToJumpMove(JumpMoveState.none);
+                }
+                break;
+            default:
+                break;
         }
     }
 
     public override void RandomAttackType(AttackCategories cate)
     {
         AttackAssignment[] attacks = attackConfigurations[(int)cate].attacks;
-        switch (cate)
+        int[] powers = new int[attacks.Length];
+        for (int i = 0; i < attacks.Length; i++)
+        {
+            powers[i] = attacks[i].weight;
+        }
+        int a = RandomWithWeight(powers);
+        curAttackType = attacks[a].attack;
+        /*switch (cate)
         {
             case AttackCategories.A:
                 break;
             case AttackCategories.B:
-                int[] powers = new int[attacks.Length];
-                for(int i = 0; i < attacks.Length; i++)
-                {
-                    powers[i] = attacks[i].weight;
-                }
-                int a = RandomWithWeight(powers);
-                curAttackType = attacks[a].attack;
+                
                 break;
             case AttackCategories.C:
                 break;
             default:
                 break;
-        }
+        }*/
     }
 
     public override void Attack()
     {
         switch (curAttackType)
         {
+            case AttackMethods.Move:
+                jumpCount = Random.Range(minJumpCount, maxJumpCount);
+                ChangeState(CharacterState.Run);
+                break;
             case AttackMethods.Umbrella:
                 ani.Play("shoot");
                 attack.SkillBlackUmbrella();

+ 1 - 1
ActionTowerDefense/Assets/Scripts/Boss/WaterGhost/WaterSpriteAttackController.cs

@@ -58,7 +58,7 @@ public class WaterSpriteAttackController : AttackController
             pastTime -= Time.deltaTime;
             if (pastTime <= 0)
             {
-                ws.EndCurAttackState(false);
+                ws.EndCurAttackState(true);
                 isUmbrellaBack = false;
             }
         }

+ 4 - 0
ActionTowerDefense/Assets/Scripts/Boss/WaterGhost/WaterSprite_SpineEvent.cs

@@ -8,4 +8,8 @@ public class WaterSprite_SpineEvent : SpineEvent
     {
         isAttackOn = true;
     }
+
+    private void hitwater()
+    {
+    }
 }

+ 7 - 1
ActionTowerDefense/Assets/Scripts/Characters/BeHitTrigger.cs

@@ -38,7 +38,13 @@ public class BeHitTrigger : MonoBehaviour
         //敌方士兵受到起手式伤害/我方士兵受到伤害
         if (isDemSummon || owner.GetComponent<Demonic>())
         {
-            TurnWhite();
+            try
+            {
+                TurnWhite();
+            }
+            catch
+            {
+            }
         }
     }
 

+ 1 - 0
ActionTowerDefense/Assets/Scripts/GameManager.cs

@@ -23,6 +23,7 @@ public class GameManager : MonoBehaviour
     public GameObject[] demonicNum;
     public TextMeshProUGUI text;
     static public SoldierType[] curSoldiers;   //本局游戏选择的三个士兵
+    public GameObject chapterBG;    //当前关卡的原始背景(用于和boss背景做替换)
 
     private JSONNode Loader(string fileName)
     {