Browse Source

移动顿帧脚本,移动融合大胖子、光球融魂技

wgl 6 tháng trước cách đây
mục cha
commit
f836c8f1d5

+ 39 - 1
ActionTowerDefense/Assets/Resources/Prefab/Player.prefab

@@ -698,6 +698,7 @@ GameObject:
   - component: {fileID: 5507929826741927014}
   - component: {fileID: 3896813473903261645}
   - component: {fileID: 5405385815050199314}
+  - component: {fileID: 6710692963350512933}
   m_Layer: 6
   m_Name: Player
   m_TagString: Player
@@ -1052,6 +1053,9 @@ MonoBehaviour:
       time: 0
     armor:
       rate: 0
+    vulnerable:
+      rate: 0
+      time: 0
     changeDamage:
       rate: 0
     sustainedInjury:
@@ -1097,6 +1101,9 @@ MonoBehaviour:
         time: 0
       armor:
         rate: 0
+      vulnerable:
+        rate: 0
+        time: 0
       changeDamage:
         rate: 0
       sustainedInjury:
@@ -1127,7 +1134,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 1d04dd6e35d71724689001e450625c39, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  curSpecialStates: ffffffff
+  curSpecialStates: 0
   attributeTime: 0
   resistances:
     Float: 0
@@ -1138,6 +1145,32 @@ MonoBehaviour:
   decelerationRatioX: 2
   decelerationRatioY: 15
   floatingState: 0
+  haveVulnerable: 0
+  vulnerableTime: 0
+--- !u!114 &6710692963350512933
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 3571941038519084344}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 26e0555ab9e6d8c48aefa0ef06ff5e85, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  conversionRate:
+  - 0.5
+  - 0.5
+  - 0.5
+  conductSkills: 000000000200000005000000
+  giant:
+    bigGiant: {fileID: 5440846222648032759, guid: d64528a2dcc945b4a9ea5d5a859679f3, type: 3}
+    temptHp: 1000
+    temptTime: 10
+  photon:
+    obj: {fileID: 0}
+    photosphereHp: 0
 --- !u!1 &3571941039716665622
 GameObject:
   m_ObjectHideFlags: 0
@@ -1342,6 +1375,7 @@ MeshRenderer:
   m_Materials:
   - {fileID: 2100000, guid: 1b17f7962e0b9be49bb10e99c6bd95a6, type: 2}
   - {fileID: 2100000, guid: 0c319badfe2307a48b8810d891649565, type: 2}
+  - {fileID: 2100000, guid: 1b17f7962e0b9be49bb10e99c6bd95a6, type: 2}
   - {fileID: 2100000, guid: 8f08601a75fbb72488593cad9f89acca, type: 2}
   - {fileID: 2100000, guid: 0c319badfe2307a48b8810d891649565, type: 2}
   m_StaticBatchInfo:
@@ -1490,6 +1524,7 @@ MonoBehaviour:
   owner: {fileID: 0}
   attackerID: 0
   curX: 0
+  isFreeze: 0
 --- !u!1 &5747259993936315763
 GameObject:
   m_ObjectHideFlags: 0
@@ -1819,6 +1854,9 @@ MonoBehaviour:
       time: 0
     armor:
       rate: 0
+    vulnerable:
+      rate: 0
+      time: 0
     changeDamage:
       rate: 0
     sustainedInjury:

+ 8 - 32
ActionTowerDefense/Assets/Scripts/Characters/AttackController.cs

@@ -45,10 +45,7 @@ public class AttackInfo
         [LabelText("上升高度")]
         public Vector2 height;  
     }
-    private bool ShowFloatStateValue()
-    {
-        return attackEffect.Contains(AttackEffect.FloatState);
-    }
+    private bool ShowFloatStateValue() => attackEffect.Contains(AttackEffect.FloatState);
     [ShowIf("ShowFloatStateValue")][LabelText("漂浮参数")]
     public FloatState floatState;
 
@@ -62,10 +59,7 @@ public class AttackInfo
         [LabelText("落地后眩晕时间")]
         public float time;
     }
-    private bool ShowBlowUpValue()
-    {
-        return attackEffect.Contains(AttackEffect.BlowUp);
-    }
+    private bool ShowBlowUpValue() => attackEffect.Contains(AttackEffect.BlowUp);
     [ShowIf("ShowBlowUpValue")][LabelText("击飞参数")]
     public BlowUp blowUp;
 
@@ -79,10 +73,7 @@ public class AttackInfo
         [LabelText("落地后眩晕时间")]
         public float time;
     }
-    private bool ShowShotDownValue()
-    {
-        return attackEffect.Contains(AttackEffect.ShotDown);
-    }
+    private bool ShowShotDownValue() => attackEffect.Contains(AttackEffect.ShotDown);
     [ShowIf("ShowShotDownValue")][LabelText("击落参数")]
     public ShotDown shotDown;
 
@@ -92,10 +83,7 @@ public class AttackInfo
         [LabelText("持续时间")]
         public float time;
     }
-    private bool ShowStunValue()
-    {
-        return attackEffect.Contains(AttackEffect.Stun);
-    }
+    private bool ShowStunValue() => attackEffect.Contains(AttackEffect.Stun);
     [ShowIf("ShowStunValue")][LabelText("击晕参数")]
     public Stun stun;
 
@@ -105,10 +93,7 @@ public class AttackInfo
         [LabelText("穿甲值")]
         public int rate;
     }
-    private bool ShowArmorValue()
-    {
-        return attackEffect.Contains(AttackEffect.Armor);
-    }
+    private bool ShowArmorValue() => attackEffect.Contains(AttackEffect.Armor);
     [ShowIf("ShowArmorValue")][LabelText("穿甲参数")]
     public Armor armor;
 
@@ -120,10 +105,7 @@ public class AttackInfo
         [LabelText("持续时间")]
         public float time; 
     }
-    private bool ShowVulnerable()
-    {
-        return attackEffect.Contains(AttackEffect.Vulnerable);
-    }
+    private bool ShowVulnerable() => attackEffect.Contains(AttackEffect.Vulnerable);
     [ShowIf("ShowVulnerable")][LabelText("易伤参数")]
     public Vulnerable vulnerable;
 
@@ -132,10 +114,7 @@ public class AttackInfo
     {
         public float rate;  //增加或减少攻击倍率
     }
-    private bool ShowChangeDamageValue()
-    {
-        return attackEffect.Contains(AttackEffect.ChangeDamage);
-    }
+    private bool ShowChangeDamageValue() => attackEffect.Contains(AttackEffect.ChangeDamage);
     [ShowIf("ShowChangeDamageValue")][LabelText("更改攻击力参数")]
     public ChangeDamage changeDamage;
 
@@ -144,10 +123,7 @@ public class AttackInfo
     {
         public float damage;    //每次造成的伤害数值
     }
-    private bool ShowSustainedInjuryValue()
-    {
-        return attackEffect.Contains(AttackEffect.SustainedInjury);
-    }
+    private bool ShowSustainedInjuryValue() => attackEffect.Contains(AttackEffect.SustainedInjury);
     [ShowIf("ShowSustainedInjuryValue")][LabelText("持续伤害参数")]
     public SustainedInjury sustainedInjury;
 

+ 37 - 1
ActionTowerDefense/Assets/Scripts/Characters/AttributeStatus.cs

@@ -63,10 +63,17 @@ public class AttributeStatus : MonoBehaviour
     private float normalFallSpeed = 15f;
 
     [FoldoutGroup("易伤")]
-    [DisplayOnly][ToggleLeft] public bool haveVulnerable;
+    [DisplayOnly] public bool haveVulnerable;
+    [FoldoutGroup("易伤")]
     [DisplayOnly] public float vulnerableTime;
     private float vulnerableRate;
 
+    //顿帧
+    private int freezeFrame;
+    [HideInInspector]
+    public bool isFreeze;
+    private RigidbodyConstraints origRC;
+
     private void Awake()
     {
         character = GetComponent<MoveCharacter>();
@@ -76,11 +83,27 @@ public class AttributeStatus : MonoBehaviour
 
     public void Update()
     {
+        //易伤
         vulnerableTime -= Time.deltaTime;
         if (vulnerableTime <= 0)
         {
             haveVulnerable = false;
         }
+
+        //顿帧
+        if (isFreeze)
+        {
+            if (freezeFrame <= 0)
+            {
+                isFreeze = false;
+                character.ani.speed = 1;
+                if (character.rb.constraints == RigidbodyConstraints.FreezeAll)
+                {
+                    character.rb.constraints = origRC;
+                }
+            }
+            freezeFrame -= 1;
+        }
     }
 
     //CharacterState为SpecialStatus时调用此函数
@@ -354,4 +377,17 @@ public class AttributeStatus : MonoBehaviour
         vulnerableRate = vulnerable.rate;
         haveVulnerable = true;
     }
+
+    //顿帧
+    public void FreezeFrame(int frame)
+    {
+        if (!isFreeze)
+        {
+            origRC = character.rb.constraints;
+        }
+        isFreeze = true;
+        freezeFrame = frame;
+        character.ani.speed = 0;
+        character.rb.constraints = RigidbodyConstraints.FreezeAll;
+    }
 }

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

@@ -12,10 +12,6 @@ public class BeHitTrigger : MonoBehaviour
     [Header("µ±Ç°XÖµ(¹¥»÷Öµ-¿¹»÷´òÖµ)")]
     [DisplayOnly]
     public int curX;
-    private int freezeFrame;
-    [HideInInspector]
-    public bool isFreeze;
-    private RigidbodyConstraints origRC;
 
     private void Awake()
     {
@@ -32,32 +28,8 @@ public class BeHitTrigger : MonoBehaviour
         owner.BeHit(attackInfo,dir);
     }
 
-    public void FreezeFrame(int frame)
-    {
-        if (!isFreeze)
-        {
-            origRC = owner.rb.constraints;
-        }
-        isFreeze = true;
-        freezeFrame = frame;
-        owner.ani.speed = 0;
-        owner.rb.constraints = RigidbodyConstraints.FreezeAll;
-    }
-
     private void Update()
     { 
-        if (isFreeze)
-        {
-            if (freezeFrame <= 0)
-            {
-                isFreeze = false;
-                owner.ani.speed = 1;
-                if (owner.rb.constraints == RigidbodyConstraints.FreezeAll)
-                {
-                    owner.rb.constraints = origRC;
-                }
-            }
-            freezeFrame -= 1;
-        }
+
     }
 }

+ 93 - 196
ActionTowerDefense/Assets/Scripts/Characters/PlayerController.cs

@@ -28,6 +28,7 @@ public class PlayerController : MoveCharacter
     public SkeletonMecanim skeletonMecanim;
     private SpiritSystem spiritSystem;
     private ScreenShake ss;
+    private ConductController conductController;
 
     [Header("蓝耗")]
     public float mp;
@@ -126,22 +127,13 @@ public class PlayerController : MoveCharacter
     private int cacheConductId;
     [Header("召唤相应时间")] [Tooltip("在此时间内松手为召唤")] public float totalCacheSummonTime;
     [Header("融魂相应时间")] [Tooltip("在此时间以外松手为融魂")] public float[] canConductTime;
-    [Header("融魂技")] [Tooltip("选择相应的融魂技能")] public ConductSkills[] conductSkills;
     public bool[] conductCanRelease;        //能否进入指挥技蓄力状态
     public ConductReadyTip conductReadyTip; //指挥技就绪
     private bool isReadyConduct;
     [Header("时间倍率")] [Tooltip("时间速度放慢到正常的几倍")] public float timeSlowingMultiplier;
     [DisplayOnly]public float fixedDeltaTime;
     public float readyTipFxTime;
-    [Header("转换率")] public float[] conversionRate;
-    //大胖子
-    [Header("融合临时血量基数")] public int temptHp;
-    [Header("融合血量持续时间")] public float temptTime;
-    public GameObject[] bigGiant;
-
-    //光球
-    public GameObject photosphereObj;
-    [Header("光球血量基数")] public int photosphereHp;
+
     //攻击力
     [Header("增加攻击力特效")]
     public GameObject attackEffect;
@@ -166,21 +158,6 @@ public class PlayerController : MoveCharacter
     [Header("飞剑角度入射角")] public float flyintSwordsArrivalAngle;
     [Header("飞剑数量基数")] public int flyingSwordsNum;
 
-    public enum ConductSkills
-    {
-        Giant,              //胖子:合成大胖子
-        Photosphere,        //胖子:光球
-        AddAttack,          //胖子:增加攻击力
-
-        Mountain,           //气功师:泰山压顶
-        WavePower,          //气功师:气功波
-        SwordsControl,      //气功师:御剑术
-
-        AngryBullet,        //弓箭手:怨气弹
-        FlyingSwords,     //扇形飞剑
-    }
-
-
     public bool btnJumpPress
     {
         get
@@ -367,6 +344,7 @@ public class PlayerController : MoveCharacter
         PlayerInput playerInput = transform.GetComponent<PlayerInput>();
         ss = Camera.main.GetComponentInParent<ScreenShake>();
         spirits = GetComponent<Spirits>();
+        conductController = GetComponent<ConductController>();
         playerId = playerInput.playerIndex;
         transform.position = new Vector3(pos.x, pos.y, 0);
         switch (playerId)
@@ -592,7 +570,7 @@ public class PlayerController : MoveCharacter
         {
             if (isReadyConduct)
             {
-                Conduct();
+                conductController.Conduct(cacheConductId);
             }
             isReadyConduct = false;
             return true;
@@ -606,7 +584,7 @@ public class PlayerController : MoveCharacter
                 if (!conductReadyTip.isShowing1 && !conductReadyTip.isShowingNoDemonic)
                 {
                     int boostNum = demonicDic[nowConductButton].Count;
-                    int dienum = Mathf.RoundToInt(boostNum * conversionRate[nowConductButton]);
+                    int dienum = (int)(boostNum * conductController.conversionRate[nowConductButton] + 0.5f);
                     if (boostNum == 1)
                     {
                         dienum = 1;
@@ -628,7 +606,7 @@ public class PlayerController : MoveCharacter
                 if (!conductReadyTip.isShowing0 && !conductReadyTip.isShowingNoDemonic)
                 {
                     int boostNum = demonicDic[nowConductButton].Count;
-                    int dienum = Mathf.RoundToInt(boostNum * conversionRate[nowConductButton]);
+                    int dienum = (int)(boostNum * conductController.conversionRate[nowConductButton] + 0.5f);
                     if (boostNum == 1)
                     {
                         dienum = 1;
@@ -652,7 +630,7 @@ public class PlayerController : MoveCharacter
                     Time.timeScale = timeSlowingMultiplier;
                     Time.fixedDeltaTime = fixedDeltaTime * Time.timeScale;
                     int boostNum = demonicDic[nowConductButton].Count;
-                    int dienum = Mathf.RoundToInt(boostNum * conversionRate[nowConductButton]);
+                    int dienum = (int)(boostNum * conductController.conversionRate[nowConductButton] + 0.5f);
                     if (boostNum == 1)
                     {
                         dienum = 1;
@@ -671,173 +649,92 @@ public class PlayerController : MoveCharacter
 
     public void Conduct()
     {
-        int boostNum = demonicDic[cacheConductId].Count;
-        int dienum = Mathf.RoundToInt(boostNum * conversionRate[cacheConductId]);
-        if (dienum == 0 && boostNum >= 1)
-        {
-            dienum = 1;
-        }
-        if (dienum > 0)
-        {
-            GameObject obj;
-            List<int> dieId = new List<int>();
-            List<Demonic> dieDemonic = new List<Demonic>();
-            while (dieId.Count < dienum)
-            {
-                int id = UnityEngine.Random.Range(0, boostNum);
-                if (!dieId.Exists(t => t == id))
-                {
-                    dieId.Add(id);
-                    dieDemonic.Add(demonicDic[cacheConductId][id]);
-                }
-            }
-            foreach (Demonic d in dieDemonic)
-            {
-                d.ChangeState(CharacterState.Die);
-            }
-            switch (conductSkills[cacheConductId])
-            {
-                //巨人
-                case ConductSkills.Giant:
-                    GameObject demonicObj = PoolManager.Instantiate(bigGiant[cacheConductId]);
-                    demonicObj.SetActive(false);
-                    BigSoldier bs = demonicObj.GetComponent<BigSoldier>();
-                    bs.id = cacheConductId + 3;
-                    demonicDic[bs.id].Add(bs);
-                    if(bs.id < 3)
-                    {
-                        demonicNums[bs.id].text = demonicDic[bs.id].Count.ToString();
-                    }       
-                    int tempthp = boostNum * temptHp;
-                    bs.playerID = playerId;
-                    demonicObj.transform.parent = null;
-                    demonicObj.transform.localEulerAngles = Vector3.zero;
-                    bs.boostNum = boostNum;
-                    if (isInSoulTower)
-                    {
-                        ls.AddDenomic(bs);
-                    }
-                    bs.player = this;
-                    bs.Settings();
-                    bs.GetTemptHP(tempthp, temptTime);
-                    int order = bs.baseSortingOrder + demonicDic[bs.id].Count;
-                    bs.SetSortingOrder(order);
-                    Vector3 offset = demonicSummonPos[0] * 2;
-                    if (bodyTrans.localScale.x > 0)
-                    {
-                        demonicObj.transform.position = transform.position + offset;
-                        if (bs.bodyTrans.localScale.x < 0)
-                        {
-                            bs.Turn();
-                        }
-                    }
-                    else
-                    {
-                        demonicObj.transform.position = transform.position + new Vector3(-offset.x, offset.y, offset.z);
-                        if (bs.bodyTrans.localScale.x > 0)
-                        {
-                            bs.Turn();
-                        }
-                    }
-                    demonicObj.SetActive(true);
-                    break;
-                case ConductSkills.Photosphere:
-                    conductCanRelease[cacheConductId] = false;
-                    obj = Instantiate(photosphereObj, transform);
-                    obj.transform.position = transform.position + Vector3.up;
-                    Photosphere photosphere = obj.GetComponent<Photosphere>();
-                    photosphere.owner = this;
-                    photosphere.conductId = cacheConductId;
-                    photosphere.hp = boostNum * photosphereHp;
-                    break;
-                case ConductSkills.AddAttack:
-                    List<Demonic> newGiants = new List<Demonic>();
-                    foreach (Demonic d in demonicDic[cacheConductId])
-                    {
-                        if (!d.isDie)
-                        {
-                            newGiants.Add(d);
-                            if (d.attackController.addAttackEffect == null)
-                            {
-                                d.attackController.addAttackEffect = Instantiate(attackEffect, d.bodyTrans.position, new Quaternion(0, 0, 0, 0), d.bodyTrans);
-                            }
-                            d.attackController.addAttackEffect.transform.GetChild(0).gameObject.SetActive(true);
-                        }
-                    }
-                    foreach (Demonic d in newGiants)
-                    {
-                        int damage = d.attackController.curDamage;
-                        d.attackController.curDamage += (int)(addRate * boostNum * damage);
-                    }
-                    break;
-                //气功师
-                case ConductSkills.Mountain:
-                    conductCanRelease[cacheConductId] = false;
-                    GameObject curMountain = Instantiate(mountain, null);
-                    Vector3 moffset = mountainOffset;
-                    Vector3 sc = curMountain.transform.localScale;
-                    sc.x = largeX * dienum;
-                    curMountain.transform.localScale = sc;
-                    if (bodyTrans.localScale.x < 0)
-                    {
-                        moffset.x = mountainOffset.x + sc.x / 2;
-                    }
-                    else
-                    {
-                        moffset.x = -mountainOffset.x - sc.x / 2;
-                    }
-                    Mountain MT = curMountain.GetComponent<Mountain>();
-                    curMountain.transform.position = transform.position + moffset;
-                    MT.pc = this;
-                    MT.id = cacheConductId;
-                    MT.demonicNum = boostNum;
-                    break;
-                case ConductSkills.WavePower:
-                    rb.constraints = RigidbodyConstraints.FreezeAll;
-                    rb.useGravity = false;
-                    conductCanRelease[cacheConductId] = false;
-                    obj = Instantiate(wavePowerObj, transform);
-                    obj.transform.position = transform.position + Vector3.up;
-                    WavePowerSkill wps = obj.GetComponent<WavePowerSkill>();
-                    wps.continueTime = wps.singleTime * dienum;
-                    wps.longFX = (int)bodyTrans.localScale.x;
-                    wps.damage = wavePowerDamage * boostNum;
-                    wps.cacheID = cacheConductId;
-                    wps.pc = this;
-                    break;
-                case ConductSkills.SwordsControl:
-                    conductCanRelease[cacheConductId] = false;
-                    obj = Instantiate(flyingSwordsObj, transform);
-                    obj.transform.position = transform.position + Vector3.up;
-                    SwordsControl swordsControl = obj.GetComponentInChildren<SwordsControl>();
-                    swordsControl.owner = this;
-                    swordsControl.conductId = cacheConductId;
-                    swordsControl.boostNum = boostNum;
-                    break;
-                //弓箭手
-                case ConductSkills.AngryBullet:
-                    conductCanRelease[cacheConductId] = false;
-                    obj = Instantiate(angryBulletObj);
-                    AngryBulletControl angryBulletControl = obj.GetComponent<AngryBulletControl>();
-                    angryBulletControl.playerController = this;
-                    angryBulletControl.cacheConductId = cacheConductId;
-                    angryBulletControl.maxNum = boostNum * angryBulletNum;
-                    break;
-                case ConductSkills.FlyingSwords:
-                    obj = Instantiate(fanFlyingSwords);
-                    FanFlyingSwords FFS = obj.GetComponent<FanFlyingSwords>();
-                    FFS.owner = this;
-                    FFS.angleRange = flyingSwordsAngleRange;
-                    FFS.arrivalAngle = flyintSwordsArrivalAngle;
-                    FFS.swordsNum = boostNum * flyingSwordsNum;
-                    FFS.Biu();
-                    break;
-            }
-        }
-        else
-        {
-            print("使魔不足");
-        }
+            //switch (conductSkills[cacheConductId])
+            //{
+            //    //巨人
+            //    case ConductSkills.AddAttack:
+            //        List<Demonic> newGiants = new List<Demonic>();
+            //        foreach (Demonic d in demonicDic[cacheConductId])
+            //        {
+            //            if (!d.isDie)
+            //            {
+            //                newGiants.Add(d);
+            //                if (d.attackController.addAttackEffect == null)
+            //                {
+            //                    d.attackController.addAttackEffect = Instantiate(attackEffect, d.bodyTrans.position, new Quaternion(0, 0, 0, 0), d.bodyTrans);
+            //                }
+            //                d.attackController.addAttackEffect.transform.GetChild(0).gameObject.SetActive(true);
+            //            }
+            //        }
+            //        foreach (Demonic d in newGiants)
+            //        {
+            //            int damage = d.attackController.curDamage;
+            //            d.attackController.curDamage += (int)(addRate * boostNum * damage);
+            //        }
+            //        break;
+            //    //气功师
+            //    case ConductSkills.Mountain:
+            //        conductCanRelease[cacheConductId] = false;
+            //        GameObject curMountain = Instantiate(mountain, null);
+            //        Vector3 moffset = mountainOffset;
+            //        Vector3 sc = curMountain.transform.localScale;
+            //        sc.x = largeX * dienum;
+            //        curMountain.transform.localScale = sc;
+            //        if (bodyTrans.localScale.x < 0)
+            //        {
+            //            moffset.x = mountainOffset.x + sc.x / 2;
+            //        }
+            //        else
+            //        {
+            //            moffset.x = -mountainOffset.x - sc.x / 2;
+            //        }
+            //        Mountain MT = curMountain.GetComponent<Mountain>();
+            //        curMountain.transform.position = transform.position + moffset;
+            //        MT.pc = this;
+            //        MT.id = cacheConductId;
+            //        MT.demonicNum = boostNum;
+            //        break;
+            //    case ConductSkills.WavePower:
+            //        rb.constraints = RigidbodyConstraints.FreezeAll;
+            //        rb.useGravity = false;
+            //        conductCanRelease[cacheConductId] = false;
+            //        obj = Instantiate(wavePowerObj, transform);
+            //        obj.transform.position = transform.position + Vector3.up;
+            //        WavePowerSkill wps = obj.GetComponent<WavePowerSkill>();
+            //        wps.continueTime = wps.singleTime * dienum;
+            //        wps.longFX = (int)bodyTrans.localScale.x;
+            //        wps.damage = wavePowerDamage * boostNum;
+            //        wps.cacheID = cacheConductId;
+            //        wps.pc = this;
+            //        break;
+            //    case ConductSkills.SwordsControl:
+            //        conductCanRelease[cacheConductId] = false;
+            //        obj = Instantiate(flyingSwordsObj, transform);
+            //        obj.transform.position = transform.position + Vector3.up;
+            //        SwordsControl swordsControl = obj.GetComponentInChildren<SwordsControl>();
+            //        swordsControl.owner = this;
+            //        swordsControl.conductId = cacheConductId;
+            //        swordsControl.boostNum = boostNum;
+            //        break;
+            //    //弓箭手
+            //    case ConductSkills.AngryBullet:
+            //        conductCanRelease[cacheConductId] = false;
+            //        obj = Instantiate(angryBulletObj);
+            //        AngryBulletControl angryBulletControl = obj.GetComponent<AngryBulletControl>();
+            //        angryBulletControl.playerController = this;
+            //        angryBulletControl.cacheConductId = cacheConductId;
+            //        angryBulletControl.maxNum = boostNum * angryBulletNum;
+            //        break;
+            //    case ConductSkills.FlyingSwords:
+            //        obj = Instantiate(fanFlyingSwords);
+            //        FanFlyingSwords FFS = obj.GetComponent<FanFlyingSwords>();
+            //        FFS.owner = this;
+            //        FFS.angleRange = flyingSwordsAngleRange;
+            //        FFS.arrivalAngle = flyintSwordsArrivalAngle;
+            //        FFS.swordsNum = boostNum * flyingSwordsNum;
+            //        FFS.Biu();
+            //        break;
+            //}
     }
 
     private int cannotConductfx;

+ 245 - 0
ActionTowerDefense/Assets/Scripts/Conduct/ConductController.cs

@@ -0,0 +1,245 @@
+using UnityEngine;
+using Sirenix.OdinInspector;
+using System.Collections.Generic;
+using System;
+using System.Linq;
+
+public class ConductController : MonoBehaviour
+{
+    //组件
+    private PlayerController playerController;
+
+    //融魂技
+    public enum ConductSkills
+    {
+        //弓箭手
+        [LabelText("怨气弹")]
+        AngryBullet,
+        [LabelText("扇形飞剑")]
+        FlyingSwords,
+
+        //胖子
+        [LabelText("合成大胖子")]
+        Giant,
+        [LabelText("光球")]
+        Photon, 
+        [LabelText("增加攻击力")]
+        AddAttack,
+
+        //棒子
+        [LabelText("泰山压顶")]
+        Mountain,
+        [LabelText("气功波")]
+        WavePower,
+        [LabelText("御剑术")]
+        SwordsControl,
+    }
+
+    [LabelText("转换率")] public float[] conversionRate;
+    [LabelText("融魂技")] public ConductSkills[] conductSkills;
+    
+    [Serializable] public struct Giant
+    {
+        public GameObject bigGiant;
+        [LabelText("临时血量基数")]
+        public int temptHp;
+        [LabelText("临时血量持续时间")] 
+        public float temptTime;
+    }
+    private bool ShowGiant() => conductSkills.Contains(ConductSkills.Giant);
+    [ShowIf("ShowGiant")][LabelText("合成大胖子参数")]
+    public Giant giant;
+
+    [Serializable]public struct Photon
+    {
+        public GameObject obj;
+        [LabelText("血量基数")]
+        public int photosphereHp;
+    }
+    private bool ShowPhotosphere() => conductSkills.Contains(ConductSkills.Photon);
+    [ShowIf("ShowPhotosphere")][LabelText("光球参数")]
+    public Photon photon;
+
+    private void Awake()
+    {
+        playerController = GetComponent<PlayerController>();
+    }
+
+    void Start()
+    {
+        
+    }
+
+    void Update()
+    {
+        
+    }
+    public void Conduct(int demonicId)
+    {
+        int boostNum = playerController.demonicDic[demonicId].Count;
+        int dienum = (int)(boostNum * conversionRate[demonicId] + 0.5f);
+        if (dienum == 0 && boostNum >= 1)
+        {
+            dienum = 1;
+        }
+        if (dienum > 0)
+        {
+            GameObject obj;
+            List<int> dieId = new List<int>();
+            List<Demonic> dieDemonic = new List<Demonic>();
+            while (dieId.Count < dienum)
+            {
+                int id = UnityEngine.Random.Range(0, boostNum);
+                if (!dieId.Exists(t => t == id))
+                {
+                    dieId.Add(id);
+                    dieDemonic.Add(playerController.demonicDic[demonicId][id]);
+                }
+            }
+            foreach (Demonic d in dieDemonic)
+            {
+                d.ChangeState(CharacterState.Die);
+            }
+            switch (conductSkills[demonicId])
+            {
+                /*胖子*/
+                //融合大胖子
+                case ConductSkills.Giant:
+                    GameObject demonicObj = PoolManager.Instantiate(giant.bigGiant);
+                    demonicObj.SetActive(false);
+                    BigSoldier bs = demonicObj.GetComponent<BigSoldier>();
+                    bs.id = demonicId + 3;
+                    playerController.demonicDic[bs.id].Add(bs);
+                    if (bs.id < 3)
+                    {
+                        playerController.demonicNums[bs.id].text = playerController.demonicDic[bs.id].Count.ToString();
+                    }
+                    int tempthp = boostNum * giant.temptHp;
+                    bs.playerID = playerController.playerId;
+                    demonicObj.transform.parent = null;
+                    demonicObj.transform.localEulerAngles = Vector3.zero;
+                    bs.boostNum = boostNum;
+                    if (playerController.isInSoulTower)
+                    {
+                        playerController.ls.AddDenomic(bs);
+                    }
+                    bs.player = playerController;
+                    bs.Settings();
+                    bs.GetTemptHP(tempthp, giant.temptTime);
+                    int order = bs.baseSortingOrder + playerController.demonicDic[bs.id].Count;
+                    bs.SetSortingOrder(order);
+                    Vector3 offset = playerController.demonicSummonPos[0] * 2;
+                    if (playerController.bodyTrans.localScale.x > 0)
+                    {
+                        demonicObj.transform.position = transform.position + offset;
+                        if (bs.bodyTrans.localScale.x < 0)
+                        {
+                            bs.Turn();
+                        }
+                    }
+                    else
+                    {
+                        demonicObj.transform.position = transform.position + new Vector3(-offset.x, offset.y, offset.z);
+                        if (bs.bodyTrans.localScale.x > 0)
+                        {
+                            bs.Turn();
+                        }
+                    }
+                    demonicObj.SetActive(true);
+                    break;
+                //光球
+                case ConductSkills.Photon:
+                    playerController.conductCanRelease[demonicId] = false;
+                    obj = Instantiate(photon.obj, transform);
+                    obj.transform.position = transform.position + Vector3.up;
+                    Photosphere photosphere = obj.GetComponent<Photosphere>();
+                    photosphere.owner = playerController;
+                    photosphere.conductId = demonicId;
+                    photosphere.hp = boostNum * photon.photosphereHp;
+                    break;
+                    //        case ConductSkills.AddAttack:
+                    //            List<Demonic> newGiants = new List<Demonic>();
+                    //            foreach (Demonic d in demonicDic[cacheConductId])
+                    //            {
+                    //                if (!d.isDie)
+                    //                {
+                    //                    newGiants.Add(d);
+                    //                    if (d.attackController.addAttackEffect == null)
+                    //                    {
+                    //                        d.attackController.addAttackEffect = Instantiate(attackEffect, d.bodyTrans.position, new Quaternion(0, 0, 0, 0), d.bodyTrans);
+                    //                    }
+                    //                    d.attackController.addAttackEffect.transform.GetChild(0).gameObject.SetActive(true);
+                    //                }
+                    //            }
+                    //            foreach (Demonic d in newGiants)
+                    //            {
+                    //                int damage = d.attackController.curDamage;
+                    //                d.attackController.curDamage += (int)(addRate * boostNum * damage);
+                    //            }
+                    //            break;
+                    //        //气功师
+                    //        case ConductSkills.Mountain:
+                    //            conductCanRelease[cacheConductId] = false;
+                    //            GameObject curMountain = Instantiate(mountain, null);
+                    //            Vector3 moffset = mountainOffset;
+                    //            Vector3 sc = curMountain.transform.localScale;
+                    //            sc.x = largeX * dienum;
+                    //            curMountain.transform.localScale = sc;
+                    //            if (bodyTrans.localScale.x < 0)
+                    //            {
+                    //                moffset.x = mountainOffset.x + sc.x / 2;
+                    //            }
+                    //            else
+                    //            {
+                    //                moffset.x = -mountainOffset.x - sc.x / 2;
+                    //            }
+                    //            Mountain MT = curMountain.GetComponent<Mountain>();
+                    //            curMountain.transform.position = transform.position + moffset;
+                    //            MT.pc = this;
+                    //            MT.id = cacheConductId;
+                    //            MT.demonicNum = boostNum;
+                    //            break;
+                    //        case ConductSkills.WavePower:
+                    //            rb.constraints = RigidbodyConstraints.FreezeAll;
+                    //            rb.useGravity = false;
+                    //            conductCanRelease[cacheConductId] = false;
+                    //            obj = Instantiate(wavePowerObj, transform);
+                    //            obj.transform.position = transform.position + Vector3.up;
+                    //            WavePowerSkill wps = obj.GetComponent<WavePowerSkill>();
+                    //            wps.continueTime = wps.singleTime * dienum;
+                    //            wps.longFX = (int)bodyTrans.localScale.x;
+                    //            wps.damage = wavePowerDamage * boostNum;
+                    //            wps.cacheID = cacheConductId;
+                    //            wps.pc = this;
+                    //            break;
+                    //        case ConductSkills.SwordsControl:
+                    //            conductCanRelease[cacheConductId] = false;
+                    //            obj = Instantiate(flyingSwordsObj, transform);
+                    //            obj.transform.position = transform.position + Vector3.up;
+                    //            SwordsControl swordsControl = obj.GetComponentInChildren<SwordsControl>();
+                    //            swordsControl.owner = this;
+                    //            swordsControl.conductId = cacheConductId;
+                    //            swordsControl.boostNum = boostNum;
+                    //            break;
+                    //        //弓箭手
+                    //        case ConductSkills.AngryBullet:
+                    //            conductCanRelease[cacheConductId] = false;
+                    //            obj = Instantiate(angryBulletObj);
+                    //            AngryBulletControl angryBulletControl = obj.GetComponent<AngryBulletControl>();
+                    //            angryBulletControl.playerController = this;
+                    //            angryBulletControl.cacheConductId = cacheConductId;
+                    //            angryBulletControl.maxNum = boostNum * angryBulletNum;
+                    //            break;
+                    //        case ConductSkills.FlyingSwords:
+                    //            obj = Instantiate(fanFlyingSwords);
+                    //            FanFlyingSwords FFS = obj.GetComponent<FanFlyingSwords>();
+                    //            FFS.owner = this;
+                    //            FFS.angleRange = flyingSwordsAngleRange;
+                    //            FFS.arrivalAngle = flyintSwordsArrivalAngle;
+                    //            FFS.swordsNum = boostNum * flyingSwordsNum;
+                    //            FFS.Biu();
+                    //            break;
+            }
+        }
+    }
+}

+ 11 - 0
ActionTowerDefense/Assets/Scripts/Conduct/ConductController.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 26e0555ab9e6d8c48aefa0ef06ff5e85
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 8 - 7
ActionTowerDefense/Assets/Scripts/Spirits/SoulBoom.cs

@@ -65,13 +65,14 @@ public class SoulBoom : MonoBehaviour
 
     private void OnTriggerEnter(Collider other)
     {
-        Photosphere photosphere = other.GetComponentInParent<Photosphere>();
-        if (photosphere)
-        {
-            isInVain = true;
-            photosphere.Reflex(owner.beHitTrigger, attackInfo.damage);
-            return;
-        }
+        //和融魂技光球有关,先注释了,后面改英灵的时候改
+        //Photosphere photosphere = other.GetComponentInParent<Photosphere>();
+        //if (photosphere)
+        //{
+        //    isInVain = true;
+        //    photosphere.Reflex(owner.beHitTrigger, attackInfo.damage);
+        //    return;
+        //}
         BeHitTrigger beHitTrigger = other.GetComponent<BeHitTrigger>();
         if (beHitTrigger != null)
         {

+ 3 - 1
ActionTowerDefense/Assets/Scripts/SystemReflect/ScreenReflectPresets.cs

@@ -30,7 +30,9 @@ public class ScreenReflectPresets : MonoBehaviour
         public List<ScreenReflects> effects;
     }
 
+    //×é¼þ
     public ScreenShake screenShake;
+    public AttributeStatus attributeStatus;
 
     public List<ScreenReflectInfo> reflectPresets;
 
@@ -48,7 +50,7 @@ public class ScreenReflectPresets : MonoBehaviour
                             screenShake.ShakeScreen(sr.level);
                             break;
                         case ScreenReflectEffects.freezeFrame:
-                            beHitter.FreezeFrame(sr.frame);
+                            attributeStatus.FreezeFrame(sr.frame);
                             break;
                         case ScreenReflectEffects.stun:
                             //Ó²Ö±