SZAND\msx_2 10 сар өмнө
parent
commit
f752803afc

+ 7 - 2
ActionTowerDefense/Assets/Resources/Prefab/Conduct/WavePower.prefab

@@ -100,15 +100,20 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   cacheID: 0
   pc: {fileID: 0}
+  curMode: 1
   maxLength: 9
-  longSpeed: 60
+  longSpeed: 30
   longFX: 0
   maxForceX: 10000
   minForceX: 25000
   maxForceY: 3000
   minForceY: 6000
-  damage: 0
+  damage: 200
   continueTime: 2
+  hitIntervalTime: 1
+  targetEnes: []
+  singleTarget: {fileID: 0}
+  curMinDis: 0
 --- !u!65 &3625977449679299091
 BoxCollider:
   m_ObjectHideFlags: 0

+ 115 - 7
ActionTowerDefense/Assets/Scripts/Conduct/WavePowerSkill.cs

@@ -4,10 +4,20 @@ using UnityEngine;
 
 public class WavePowerSkill : MonoBehaviour
 {
+    public enum mode
+    {
+        knockUp,    //击飞
+        single,     //单体
+        all,        //群体
+    }
+
     public int cacheID;
     public PlayerController pc;
     private float curX;
 
+    [Header("两种模式,模式1:单体,模式2:群体")]
+    public mode curMode;
+
     [Header("推出去的过程")]
     public float maxLength;
     private float curLength;
@@ -23,8 +33,15 @@ public class WavePowerSkill : MonoBehaviour
     private Vector3 curForce;
     public int damage;
 
-    [Header("持续时间")]
+    [Header("时间")]
     public float continueTime;
+    public float hitIntervalTime;
+    private float curHitTime;
+
+    [Header("受控目标")]
+    public List<Enemy> targetEnes = new List<Enemy>();
+    public Enemy singleTarget;
+    public float curMinDis;
 
     private void Start()
     {
@@ -50,18 +67,109 @@ public class WavePowerSkill : MonoBehaviour
                 gameObject.SetActive(false);
             }
         }
+        AttackMode();
+    }
+
+    private void AttackMode()
+    {
+        switch (curMode)
+        {
+            case mode.knockUp:
+                break;
+            case mode.single:
+                foreach(Enemy ene in targetEnes)
+                {
+                    float dis = Mathf.Abs(ene.bodyTrans.position.x - transform.position.x);
+                    if (singleTarget == null)
+                    {
+                        curMinDis = dis;
+                        singleTarget = ene;
+                    }
+                    else if (dis < curMinDis)
+                    {
+                        singleTarget.ChangeState(CharacterState.Idle);
+                        curMinDis = dis;
+                        transform.localScale = new Vector3(curX, curMinDis * longFX, 1);
+                        singleTarget = ene;
+                    }
+                }
+                if (singleTarget)
+                {
+                    if (singleTarget.isDie)
+                    {
+                        singleTarget = null;
+                    }
+                    else
+                    {
+                        singleTarget.comaTime = continueTime;
+                        singleTarget.ChangeState(CharacterState.Coma);
+                        singleTarget.transform.position -= new Vector3(fx * longSpeed * Time.deltaTime, 0, 0);
+                        curHitTime += Time.deltaTime;
+                        if (curHitTime >= hitIntervalTime)
+                        {
+                            curHitTime = 0;
+                            singleTarget.BeHit(damage, Vector3.zero, false, 0);
+                        }
+                        curMinDis += longSpeed * Time.deltaTime;
+                    }
+                }
+                break;
+            case mode.all:
+                foreach (Enemy ene in targetEnes)
+                {
+                    if (!ene.isDie)
+                    {
+                        ene.comaTime = continueTime;
+                        ene.ChangeState(CharacterState.Coma);
+                        ene.transform.position -= new Vector3(longSpeed * Time.deltaTime, 0, 0);
+                        curHitTime += Time.deltaTime;
+                        if (curHitTime >= hitIntervalTime)
+                        {
+                            curHitTime = 0;
+                            ene.BeHit(damage, Vector3.zero, false, 0);
+                        }
+                    }
+                }
+                break;
+            default:
+                break;
+        }
     }
 
     private void OnTriggerEnter(Collider other)
     {
         if (other.gameObject.layer == 8)
         {
-            fx = (int)((Random.Range(0, 2) - 0.5f) * 2);
-            curForce = new Vector3(Random.Range(minForceX, maxForceX), Random.Range(minForceY, maxForceY), 0);
-            curForce.x = curForce.x * fx;
-            other.GetComponentInParent<Enemy>().ChangeState(CharacterState.Weak);
-            other.GetComponentInParent<Enemy>().wallDamage = damage;
-            other.GetComponentInParent<Rigidbody>().AddForce(curForce);
+            Enemy ene = other.GetComponentInParent<Enemy>();
+            switch (curMode)
+            {
+                case mode.knockUp:
+                    fx = (int)((Random.Range(0, 2) - 0.5f) * 2);
+                    curForce = new Vector3(Random.Range(minForceX, maxForceX), Random.Range(minForceY, maxForceY), 0);
+                    curForce.x *= fx;
+                    ene.ChangeState(CharacterState.Weak);
+                    ene.wallDamage = damage;
+                    ene.rb.AddForce(curForce);
+                    break;
+                case mode.single:
+                    targetEnes.Add(ene);
+                    break;
+                case mode.all:
+                    targetEnes.Add(ene);
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
+    private void OnTriggerExit(Collider other)
+    {
+        if (other.gameObject.layer == 8)
+        {
+            Enemy ene = other.GetComponentInParent<Enemy>();
+            targetEnes.Remove(ene);
+            ene.ChangeState(CharacterState.Idle);
         }
     }
 }