Browse Source

冥火涅槃

WGL 1 month ago
parent
commit
72c29d93b5

+ 26 - 7
ActionTowerDefense/Assets/Resources/Prefab/GameManager.prefab

@@ -10,6 +10,7 @@ GameObject:
   m_Component:
   - component: {fileID: 1880576200062196087}
   - component: {fileID: 1880576200062196084}
+  - component: {fileID: 1514448251370152485}
   - component: {fileID: 1880576200062196086}
   - component: {fileID: 1880576200062196041}
   - component: {fileID: 1880576200062196044}
@@ -72,9 +73,9 @@ MonoBehaviour:
   dropGoldFX: {fileID: 1723151111827507807, guid: 8ac2bd44510cc7840adf9877a9ecad46, type: 3}
   dropGoldText: {fileID: 6467251191553420251, guid: 7df1aa66331659042a29ed5c238dce79, type: 3}
   tagWeight:
-  - 100
-  - 0
-  - 0
+  - 20
+  - 15
+  - 65
   unlockLevel: 01000000010000000100000008000000
   baseChance:
   - 100
@@ -107,9 +108,9 @@ MonoBehaviour:
   mpRegen: 0
   leveType: 0
   ratioIncrease:
-  - 0.4
-  - 1.6
-  - -0.8
+  - 1
+  - 2
+  - 1
   nowLevel: 0
   money: 0
   myTreasuresTag: 0000000000000000000000000000000000000000000000000000000000000000
@@ -118,6 +119,24 @@ MonoBehaviour:
   totalGameTime: 0
   gameType: 0
   levelRatio: 1
+--- !u!114 &1514448251370152485
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1880576200062196085}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 50c57bdfefa1d334fb3e43597477332d, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  netherfireRebirth:
+    attributeTag: 7
+    sacrificeRatio: 640000003c0000003200000032000000
+    power: 01000000020000000300000004000000
+    effectBonus: 5
+    randomRange: {x: 8, y: 4}
 --- !u!114 &1880576200062196086
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -159,7 +178,7 @@ MonoBehaviour:
   levelIdA_debug: 8
   levelIdB_debug: 2
   curLevel: {fileID: 0}
-  curLevelID: 0
+  curLevelID: 5
   levels:
   - "0:9\u54081\u5173\u5361\u5C1D\u8BD5"
   - "1:\u6C34\u9762\u5173\u53612"

+ 17 - 7
ActionTowerDefense/Assets/Resources/Prefab/Player.prefab

@@ -5688,6 +5688,8 @@ MonoBehaviour:
   state: 1
   totalHp: 500
   hp: 0
+  regeneration: 0
+  regenerationTime: 0
   canFly: 0
   canControlFly: 0
   nowCanFly: 0
@@ -5759,6 +5761,7 @@ MonoBehaviour:
   soulCollector: {fileID: 3739918129319493242}
   skeletonMecanim: {fileID: 6843453365888964567}
   wallTrigger: {fileID: 6725358484711746229}
+  gameManager: {fileID: 0}
   totalSummonTime: 1.233
   summonTime: 1.233
   onlySummonTime: 1
@@ -5959,6 +5962,8 @@ MonoBehaviour:
       attackValue: 0
       damage: 0
       attackDir: {x: 0, y: 0, z: 0}
+      criticalChance: 0
+      lifesteal: 0
       effect: {fileID: 0}
       attackEffect: 
       attackMethod_Type: 0
@@ -6024,6 +6029,7 @@ MonoBehaviour:
   nextEndKeyTime: 0
   curKeyNum: 0
   beTargetCharacter: []
+  lifesteal: 1
 --- !u!114 &6710692963350512933
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -6036,11 +6042,9 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 26e0555ab9e6d8c48aefa0ef06ff5e85, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  conversionRate:
-  - 0.5
-  - 0.5
-  - 0.5
-  conductSkills: 000000000100000002000000
+  rarity: 000000000000000000000000
+  conversionRate: 640000006400000064000000
+  conductSkills: 010000000100000001000000
   flyingSwords:
     obj: {fileID: 256012001268456902, guid: 26ed0fb31296bdd4bb45e22ce2b925bc, type: 3}
     angleRange: 90
@@ -6275,7 +6279,6 @@ 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:
@@ -6447,6 +6450,8 @@ MonoBehaviour:
       attackValue: 0
       damage: 0
       attackDir: {x: 0, y: 0, z: 0}
+      criticalChance: 0
+      lifesteal: 0
       effect: {fileID: 0}
       attackEffect: 
       attackMethod_Type: 0
@@ -6519,7 +6524,7 @@ MonoBehaviour:
   haveVulnerable: 0
   vulnerableTime: 0
   stackingWoudsTime: 0
-  stackingWordsNum: 0
+  stackingWords: 0
   resistances:
     controlOrder: 0
     Float: 0
@@ -6527,6 +6532,7 @@ MonoBehaviour:
     ShotDown: 0
     Weak: 1
     armor: 0
+    dodge: 0
 --- !u!114 &8780652155736106037
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -6551,6 +6557,8 @@ MonoBehaviour:
       attackValue: 0
       damage: 0
       attackDir: {x: 0, y: 0, z: 0}
+      criticalChance: 0
+      lifesteal: 0
       effect: {fileID: 0}
       attackEffect: 
       attackMethod_Type: 0
@@ -6960,6 +6968,8 @@ MonoBehaviour:
       attackValue: 0
       damage: 0
       attackDir: {x: 0, y: 0, z: 0}
+      criticalChance: 0
+      lifesteal: 0
       effect: {fileID: 0}
       attackEffect: 
       attackMethod_Type: 0

+ 12 - 1
ActionTowerDefense/Assets/Scripts/Characters/Demonic.cs

@@ -12,6 +12,8 @@ public class Demonic : MoveCharacter
 
     [FoldoutGroup("角色信息")] public string myName;
 
+    [FoldoutGroup("条件")] [LabelText("释放起手式后死亡")] public bool summonEndToDie;
+
     [Space(30)]
     [Title("Demonic属性")]
     public SoldierType soldierType;      //当前士兵属于什么兵种
@@ -47,7 +49,7 @@ public class Demonic : MoveCharacter
 
     private void OnDisable()
     {
-        PlayersInput.instance[playerID].OnDemonicRecycle(this);
+        
     }
 
     public override void FixedUpdate()
@@ -514,6 +516,11 @@ public class Demonic : MoveCharacter
                 attackController.JudgeTriggerOnOff();
                 if (attackController.attackTime <= 0)
                 {
+                    if (summonEndToDie)
+                    {
+                        ChangeState(CharacterState.Die);
+                        break;
+                    }
                     if (isInSoulTower)
                     {
                         ChangeState(CharacterState.LockSoul);
@@ -737,12 +744,16 @@ public class Demonic : MoveCharacter
                     rb.velocity = Vector3.zero;
                     ChangeState(CharacterState.Fall);
                     isDie = true;
+                    summonEndToDie = false;
+                    PlayersInput.instance[playerID].OnDemonicRecycle(this);
                 }
                 else
                 {
                     isDie = true;
                     ani.Play(AnimatorHash.ANIMATOR_die, 0, 0);
                     dieKeepTime = totalDieKeepTime;
+                    summonEndToDie = false;
+                    PlayersInput.instance[playerID].OnDemonicRecycle(this);
                 }
                 break;
             case CharacterState.LockSoul:

+ 9 - 8
ActionTowerDefense/Assets/Scripts/Characters/MoveCharacter.cs

@@ -27,6 +27,15 @@ public class MoveCharacter : Character
     [FoldoutGroup("平台")] public float RotLerpSpeed = 0.6f;
     [FoldoutGroup("平台")] [DisplayOnly] public float RotLerpTime;
 
+    [FoldoutGroup("飞行兵落地后回升")] [LabelText("是否需要判定回升")] public bool needToAdjustFlyHeight;
+    [FoldoutGroup("飞行兵落地后回升", order: -1)] [DisplayOnly] public float flyHeight;
+    [FoldoutGroup("飞行兵落地后回升")] [LabelText("最大高度")] public float maxFlyHeight;
+    [FoldoutGroup("飞行兵落地后回升")] [LabelText("最低高度")] public float minFlyHeight;
+    float refspeed = 1;
+    [FoldoutGroup("飞行兵落地后回升")] [LabelText("速度")] [Range(0, 1)] public float flyUpTime;
+    [HideInInspector]
+    public int isAdjustHeight;
+
     [Header("材质")]
     public float matState = 1;
     public GameObject spinee;
@@ -37,14 +46,6 @@ public class MoveCharacter : Character
 
     [Header("属性")]
     public float moveSpeed = 5;
-    [FoldoutGroup("飞行兵落地后回升")][LabelText("是否需要判定回升")] public bool needToAdjustFlyHeight;
-    [FoldoutGroup("飞行兵落地后回升", order:-1)][DisplayOnly] public float flyHeight;
-    [FoldoutGroup("飞行兵落地后回升")][LabelText("最大高度")] public float maxFlyHeight;
-    [FoldoutGroup("飞行兵落地后回升")][LabelText("最低高度")] public float minFlyHeight;
-    float refspeed = 1;
-    [FoldoutGroup("飞行兵落地后回升")][LabelText("速度")][Range(0, 1)] public float flyUpTime;
-    [HideInInspector]
-    public int isAdjustHeight;
 
     [Header("减伤")]
     public bool isDamageReduction;

+ 67 - 80
ActionTowerDefense/Assets/Scripts/Characters/PlayerController.cs

@@ -32,6 +32,7 @@ public class PlayerController : MoveCharacter
     private SpiritSystem spiritSystem;
     private ScreenShake ss;
     private ConductController conductController;
+    [HideInInspector] public GameManager gameManager;
     //
 
     [FoldoutGroup("召唤属性", order:-1)] public float totalSummonTime;
@@ -280,9 +281,9 @@ public class PlayerController : MoveCharacter
     public override void Init()
     {
         base.Init();
-        uiHp = GameManager.instance.p1uiHP;
-        uiMp = GameManager.instance.p1uiMP;
-        uiRush = GameManager.instance.p1uiRush;
+        uiHp = gameManager.p1uiHP;
+        uiMp = gameManager.p1uiMP;
+        uiRush = gameManager.p1uiRush;
         uiMp.pc = this;
         mp = totalMp;
         rushChargeNums = rushChargeTotalNums;
@@ -301,17 +302,18 @@ public class PlayerController : MoveCharacter
         demonicNums = new TextMeshProUGUI[3];
         for (int i = 0; i < 3; i++)
         {
-            demonicNums[i] = GameManager.instance.demonicNum[i].GetComponentInChildren<TextMeshProUGUI>();
+            demonicNums[i] = gameManager.demonicNum[i].GetComponentInChildren<TextMeshProUGUI>();
         }
         cannotConductFXs = new GameObject[3];
         for (int i = 0; i < 3; i++)
         {
-            cannotConductFXs[i] = GameManager.instance.demonicNum[i].transform.GetChild(3).gameObject;
+            cannotConductFXs[i] = gameManager.demonicNum[i].transform.GetChild(3).gameObject;
         }
     }
 
     public override void Awake()
     {
+        gameManager = GameManager.instance;
         base.Awake();
         PlayerInput playerInput = transform.GetComponent<PlayerInput>();
         ss = Camera.main.GetComponentInParent<ScreenShake>();
@@ -369,7 +371,7 @@ public class PlayerController : MoveCharacter
 
     private void Start()
     {
-        slr = GameManager.instance.GetComponent<SoldierLevelRecord>();
+        slr = gameManager.GetComponent<SoldierLevelRecord>();
     }
 
     override public void Update()
@@ -525,7 +527,7 @@ public class PlayerController : MoveCharacter
         }
         if (state != CharacterState.Conduct 
             && nowConductButton != -1 
-            && conductController.conductSkills[nowConductButton]!=ConductController.ConductSkills.Null 
+            && conductController.conductSkills[nowConductButton] != ConductSkills.Null 
             && conductTime > totalCacheSummonTime)
         {
             CheckTurn();
@@ -570,17 +572,17 @@ public class PlayerController : MoveCharacter
 
         if (!isReadyConduct && nowConductButton != -1)
         {
+            int boostNum = demonicDic[nowConductButton].Count;
+            int dienum = (int)(boostNum * conductController.conversionRate[nowConductButton]/100 + 0.5f);
+            if (boostNum == 1)
+            {
+                dienum = 1;
+            }
             if (conductTime >= canConductTime[nowConductButton] * timeSlowingMultiplier)
             {
                 isReadyConduct = true;
                 if (!conductReadyTip.isShowing1 && !conductReadyTip.isShowingNoDemonic)
                 {
-                    int boostNum = demonicDic[nowConductButton].Count;
-                    int dienum = (int)(boostNum * conductController.conversionRate[nowConductButton] + 0.5f);
-                    if (boostNum == 1)
-                    {
-                        dienum = 1;
-                    }
                     if (dienum > 0)
                     {
                         conductReadyTip.Show(1);
@@ -597,12 +599,6 @@ public class PlayerController : MoveCharacter
             {
                 if (!conductReadyTip.isShowing0 && !conductReadyTip.isShowingNoDemonic)
                 {
-                    int boostNum = demonicDic[nowConductButton].Count;
-                    int dienum = (int)(boostNum * conductController.conversionRate[nowConductButton] + 0.5f);
-                    if (boostNum == 1)
-                    {
-                        dienum = 1;
-                    }
                     if (dienum > 0)
                     {
                         conductReadyTip.Show(0);
@@ -621,12 +617,6 @@ public class PlayerController : MoveCharacter
                 {
                     Time.timeScale = timeSlowingMultiplier;
                     Time.fixedDeltaTime = fixedDeltaTime * Time.timeScale;
-                    int boostNum = demonicDic[nowConductButton].Count;
-                    int dienum = (int)(boostNum * conductController.conversionRate[nowConductButton] + 0.5f);
-                    if (boostNum == 1)
-                    {
-                        dienum = 1;
-                    }
                     if (dienum == 0)
                     {
                         conductReadyTip.Show(2, nowConductButton);
@@ -1482,11 +1472,56 @@ public class PlayerController : MoveCharacter
         }
         mp -= costMp;
         uiMp.Show(mp, totalMp);
-        CreateDemonic(demonicPrefabs[id]);
+        Demonic demonic = CreateDemonic(id);
+        if (!demonicDic.ContainsKey(id))
+        {
+            demonicDic.Add(id, new List<Demonic>());
+        }
+        demonicDic[id].Add(demonic);
+        if (id <= 2)
+        {
+            demonicNums[id].text = demonicDic[id].Count.ToString();
+        }
+        int attackSummonId = nowAttackSummonID;
+
+        if (lastSoldier != demonic.soldierType)
+        {
+            attackSummonId = 0;
+        }
+        demonic.attackController.attackSummonId = attackSummonId;
+        onlySummonTime = demonic.attackController.summonTime[attackSummonId];
+        invincibleTime = onlySummonTime + addSummonInvincibleTime;
+        restSummonTime = onlySummonTime;
+        demonic.Attack_summon();
+        lastSoldier = demonic.soldierType;
+        attackSummonId++;
+        if (attackSummonId >= demonic.attackController.attackMethod_summon.Length)
+        {
+            attackSummonId = 0;
+            AttackSummonChangeTime = 0;
+        }
+        else
+        {
+            AttackSummonChangeTime = AttackSummonChangeTotalTime;
+        }
+        nowAttackSummonID = attackSummonId;
+                //id 3~6 为四个英灵
+        if (id >= 3)
+        {
+            spirits.ultimateTimes[id - 3] -= spirits.summonCost;
+        }
+        spiritSystem.RefreshPlayerUI();
+        if (isInSoulTower)
+        {
+            ls.AddDenomic(demonic);
+        }
+    }
+
+    public Demonic CreateDemonic(int id)
+    {
         GameObject demonicObj = PoolManager.Instantiate(demonicPrefabs[id]);
         Demonic demonic = demonicObj.GetComponent<Demonic>();
         slr.SoldierAddLevelBuff(demonic);
-        GameManager gameManager = GameManager.instance;
         AttackController attackController = demonic.attackController;
         for (int i = 0; i < attackController.attackMethod_summon.Length; i++)
         {
@@ -1504,25 +1539,16 @@ public class PlayerController : MoveCharacter
         }
         demonic.attributeStatus.resistances.armor = gameManager.armor;
         demonic.attributeStatus.resistances.dodge = gameManager.dodge;
-        demonic.regeneration = GameManager.instance.regeneration;
+        demonic.regeneration = gameManager.regeneration;
         demonic.totalHp += gameManager.totalHp;
         demonic.id = id;
         demonic.playerID = playerId;
-        if (!demonicDic.ContainsKey(id))
-        {
-            demonicDic.Add(id, new List<Demonic>());
-        }
-        demonicDic[id].Add(demonic);
-        if (id <= 2)
-        {
-            demonicNums[id].text = demonicDic[id].Count.ToString();
-        }
         demonicObj.transform.parent = null;
         demonicObj.transform.localEulerAngles = Vector3.zero;
         demonicObj.transform.localScale = new Vector3(1, 1, 1);
         Vector3 offset = demonicSummonPos[id];
         //demonic.CheckTurn(-bodyTrans.localScale.x);
-        if(bodyTrans.localScale.x > 0)
+        if (bodyTrans.localScale.x > 0)
         {
             if (demonic.bodyTrans.localScale.x < 0)
             {
@@ -1536,8 +1562,8 @@ public class PlayerController : MoveCharacter
                 demonic.Turn();
             }
         }
-        demonicObj.transform.position = transform.position 
-            + new Vector3(bodyTrans.localScale.x > 0 ? offset.x: -offset.x, offset.y, offset.z);
+        demonicObj.transform.position = transform.position
+            + new Vector3(bodyTrans.localScale.x > 0 ? offset.x : -offset.x, offset.y, offset.z);
         if (demonic.canFly)
         {
             demonic.flyHeight = demonic.transform.position.y;
@@ -1546,46 +1572,7 @@ public class PlayerController : MoveCharacter
         demonic.Init();
         int order = demonicPrefabs[id].GetComponent<Demonic>().baseSortingOrder + demonicDic[demonic.id].Count;
         demonic.SetSortingOrder(order);
-
-        int attackSummonId = nowAttackSummonID;
-
-        if (lastSoldier != demonic.soldierType)
-        {
-            attackSummonId = 0;
-        }
-        demonic.attackController.attackSummonId = attackSummonId;
-        onlySummonTime = demonic.attackController.summonTime[attackSummonId];
-        invincibleTime = onlySummonTime + addSummonInvincibleTime;
-        restSummonTime = onlySummonTime;
-        demonic.Attack_summon();
-        lastSoldier = demonic.soldierType;
-        attackSummonId++;
-        if (attackSummonId >= demonic.attackController.attackMethod_summon.Length)
-        {
-            attackSummonId = 0;
-            AttackSummonChangeTime = 0;
-        }
-        else
-        {
-            AttackSummonChangeTime = AttackSummonChangeTotalTime;
-        }
-        nowAttackSummonID = attackSummonId;
-        //id 3~6 为四个英灵
-        if (id >= 3)
-        {
-            spirits.ultimateTimes[id - 3] -= spirits.summonCost;
-        }
-        spiritSystem.RefreshPlayerUI();
-        if (isInSoulTower)
-        {
-            ls.AddDenomic(demonic);
-        }
-        
-    }
-
-    public void CreateDemonic(GameObject prefab)
-    {
-        
+        return demonic;
     }
     public void OnDemonicRecycle(Demonic demonic)
     {

+ 33 - 43
ActionTowerDefense/Assets/Scripts/Conduct/ConductController.cs

@@ -4,49 +4,17 @@ using System.Collections.Generic;
 using System;
 using System.Linq;
 
-public enum AttributeTag
-{
-    [LabelText("飞行")] Flying = 1,
-    [LabelText("风")] Wind = 2,
-    [LabelText("水")] Water = 3,
-    [LabelText("岩")] Earth = 4,
-    [LabelText("地面")] Ground = 5,
-    [LabelText("雷")] Lightning = 6,
-    [LabelText("火")] Fire = 7,
-    [LabelText("木")] Nature = 8,
-}
-
 public class ConductController : MonoBehaviour
 {
     //组件
     private PlayerController playerController;
-
-    //融魂技
-    public enum ConductSkills
-    {
-        Null,
-        [LabelText("冥火涅槃")] NetherfireRebirth,
-        [LabelText("扇形飞剑")]
-        FlyingSwords,
-        [LabelText("合成大胖子")]
-        Giant,
-        [LabelText("光球")]
-        Photon, 
-    }
+    private ConductManager conductManager;
+    private GameManager gameManager;
 
     [LabelText("品质")] public int[] rarity;
     public int[] conversionRate;
     [LabelText("融魂技")] public ConductSkills[] conductSkills;
 
-    //冥火涅槃
-    [Serializable] public struct NetherfireRebirth
-    {
-        [LabelText("标签")] public AttributeTag attributeTag;
-        [LabelText("献祭比例(%)")] public int[] sacrificeRatio;
-        [LabelText("效果规模")] public int[] power;
-    }
-    [LabelText("冥火涅槃")] public NetherfireRebirth netherfireRebirth;
-
     //扇形飞剑
     [Serializable]
     public struct FlyingSwords
@@ -90,6 +58,8 @@ public class ConductController : MonoBehaviour
     private void Awake()
     {
         playerController = GetComponent<PlayerController>();
+        conductManager = ConductManager.instance;
+        gameManager = GameManager.instance;
     }
 
     void Start()
@@ -104,7 +74,7 @@ public class ConductController : MonoBehaviour
     public void Conduct(int demonicId)
     {
         int boostNum = playerController.demonicDic[demonicId].Count;
-        int dienum = (int)(boostNum * conversionRate[demonicId] + 0.5f);
+        int dienum = (int)(boostNum * conversionRate[demonicId]/100f + 0.5f);
         if (dienum == 0 && boostNum >= 1)
         {
             dienum = 1;
@@ -114,14 +84,13 @@ public class ConductController : MonoBehaviour
             GameObject obj;
             List<int> dieId = new List<int>();
             List<Demonic> dieDemonic = new List<Demonic>();
-            while (dieId.Count < dienum)
+            List<Demonic> demonicDic = new List<Demonic>(playerController.demonicDic[demonicId]);
+            for(int i = 0; i < dienum; i++)
             {
-                int id = UnityEngine.Random.Range(0, boostNum);
-                if (!dieId.Exists(t => t == id))
-                {
-                    dieId.Add(id);
-                    dieDemonic.Add(playerController.demonicDic[demonicId][id]);
-                }
+                int id = UnityEngine.Random.Range(0, demonicDic.Count);
+                dieId.Add(id);
+                dieDemonic.Add(demonicDic[id]);
+                demonicDic.RemoveAt(id);
             }
             foreach (Demonic d in dieDemonic)
             {
@@ -130,7 +99,28 @@ public class ConductController : MonoBehaviour
             switch (conductSkills[demonicId])
             {
                 case ConductSkills.NetherfireRebirth:
-
+                    ConductManager.NetherfireRebirth netherfireRebirth = conductManager.netherfireRebirth;
+                    for (int i = 0;i<dienum * netherfireRebirth.power[rarity[demonicId]]; i++)
+                    {
+                        Demonic demonic = playerController.CreateDemonic(demonicId);
+                        demonic.summonEndToDie = true;
+                        Vector3 targetPos = transform.position + new Vector3(
+                            UnityEngine.Random.Range(-netherfireRebirth.randomRange.x / 2, netherfireRebirth.randomRange.x / 2),
+                            UnityEngine.Random.Range(-netherfireRebirth.randomRange.y / 2, netherfireRebirth.randomRange.y / 2),
+                            0);
+                        if (targetPos.y < 0)
+                        {
+                            targetPos.y = 0;
+                        }
+                        demonic.gameObject.transform.position = targetPos;
+                        demonic.attackController.attackSummonId = 0;
+                        float tagAdd = 1 + netherfireRebirth.effectBonus * gameManager.myTreasuresTag[(int)netherfireRebirth.attributeTag - 1]/100;
+                        int damage = demonic.attackController.attackMethod_summon[0].attackInfo.damage;
+                        damage = (int)(damage * tagAdd);
+                        demonic.attackController.attackMethod_summon[0].attackInfo.damage = damage;
+                        demonic.Attack_summon();
+                        playerController.lastSoldier = SoldierType.Conduct;
+                    }
                     break;
                 /*弓箭手*/
                 case ConductSkills.FlyingSwords:

+ 40 - 0
ActionTowerDefense/Assets/Scripts/Conduct/ConductManager.cs

@@ -0,0 +1,40 @@
+using Sirenix.OdinInspector;
+using System;
+using UnityEngine;
+
+
+//融魂技
+public enum ConductSkills
+{
+    Null,
+    [LabelText("冥火涅槃")] NetherfireRebirth,
+    [LabelText("扇形飞剑")]
+    FlyingSwords,
+    [LabelText("合成大胖子")]
+    Giant,
+    [LabelText("光球")]
+    Photon,
+}
+public class ConductManager : MonoBehaviour
+{
+    [HideInInspector] static public ConductManager instance;
+
+    //冥火涅槃
+    [Serializable] public struct NetherfireRebirth
+    {
+        [LabelText("标签")] public AttributeTag attributeTag;
+        [LabelText("献祭比例(%)")] public int[] sacrificeRatio;
+        [LabelText("效果规模")] public int[] power;
+        [LabelText("效果加成(%)")] public float effectBonus;
+        [LabelText("随机范围")] public Vector2 randomRange;
+    }
+    [LabelText("冥火涅槃")] public NetherfireRebirth netherfireRebirth;
+
+    private void Awake()
+    {
+        if(!instance)
+        {
+            instance = this;
+        }
+    }
+}

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

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

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

@@ -6,9 +6,21 @@ using System.IO;
 using TMPro;
 using UnityEngine;
 using UnityEngine.UI;
+public enum AttributeTag
+{
+    [LabelText("飞行")] Flying = 1,
+    [LabelText("风")] Wind = 2,
+    [LabelText("水")] Water = 3,
+    [LabelText("岩")] Earth = 4,
+    [LabelText("地面")] Ground = 5,
+    [LabelText("雷")] Lightning = 6,
+    [LabelText("火")] Fire = 7,
+    [LabelText("木")] Nature = 8,
+}
 
 public enum SoldierType
 {
+    Conduct,
     [LabelText("飞剑")] sword = 0,
     [LabelText("胖子")] shield = 1,
     [LabelText("林冲")] spear = 2,