LAPTOP-OM1V99U2\永远de小亡灵 1 سال پیش
والد
کامیت
3968d8698e

+ 1 - 1
ActionTowerDefense/Assets/Resources/Prefab/FX/InvisibleEffectRange.prefab

@@ -61,7 +61,7 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   ps: {fileID: 0}
   moveCharacters: []
-  invincibleTime: 3
+  invisibleTime: 3
 --- !u!1 &746774320722880007
 GameObject:
   m_ObjectHideFlags: 0

+ 25 - 3
ActionTowerDefense/Assets/Resources/Prefab/MySpirit/Spirits_Invisible.prefab

@@ -136,7 +136,7 @@ GameObject:
   - component: {fileID: 99850206658526686}
   - component: {fileID: 2437299196472462353}
   - component: {fileID: 2472120008162019348}
-  m_Layer: 12
+  m_Layer: 7
   m_Name: Spirits_Invisible
   m_TagString: Demonic
   m_Icon: {fileID: 0}
@@ -177,6 +177,28 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   notOut: 1
+  demonic: {fileID: 2437299196472462353}
+  state: 0
+  rb: {fileID: 2472120008162019348}
+  moveSpeed: 5
+  findSoulSpeed: 10
+  minSpeed: 5
+  upSpeed: 5
+  boomSpeed: 0
+  altitude: 7
+  randomRageY: 5
+  randomRageX: 5
+  offsetY: 0
+  offsetX: 0
+  targetPos: {x: 0, y: 0, z: 0}
+  back: 20
+  hp: 0
+  posx: 0
+  targetSoul: {fileID: 0}
+  followNumber: 5
+  haveSoulNumber: 0
+  followEffect: {fileID: 4610496197409361392}
+  backSoulX: 5
 --- !u!114 &2437299196472462353
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -189,7 +211,7 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: c1bedfb340186164dbac1499b49b879e, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
-  isTran: 1
+  isTran: 0
   pc: {fileID: 0}
   isSpirit: 1
   HitCols:
@@ -211,7 +233,7 @@ MonoBehaviour:
   isNonAttack: 0
   hptp: 0
   isDie: 0
-  totalHp: 200
+  totalHp: 1000
   hp: 0
   attack1Infos:
   - damage: 0

+ 3 - 3
ActionTowerDefense/Assets/Resources/Prefab/Transfiguration/Trans_Invisible.prefab

@@ -319,6 +319,7 @@ MonoBehaviour:
   rapidFallSpeed: 30
   curFallSpeed: 0
   floatState: 0
+  matState: 0
   spinee: {fileID: 0}
   mesh: {fileID: 0}
   mats: []
@@ -336,12 +337,11 @@ MonoBehaviour:
   playerMesh: {fileID: 0}
   playerMats: []
   playerOut: []
-  isInvisible: 0
   canNotChangeHurt: 0
   soulPrefab: {fileID: 0}
   soulStartSpeed: 1
   easyToGetHit: 0.2
-  isInvincible: 0
+  isInvincible: 1
   player: {fileID: 0}
   id: 0
   costMp: 1
@@ -357,7 +357,7 @@ MonoBehaviour:
   sortingOrder: 1000
   playerID: 0
   hasEffect: 0
-  soulCollector: {fileID: 0}
+  soulCollector: {fileID: 3474542255091444345}
   isBack: 0
   runSpeed: 0
   attributeUpEffect: {fileID: 0}

+ 17 - 11
ActionTowerDefense/Assets/Scripts/MoveCharacter.cs

@@ -63,6 +63,7 @@ public class MoveCharacter : Character
     private float rise = 1;
 
     public int floatState; //0:不漂浮;1:漂浮中;2:飘着;3:掉下去
+    public float matState = 1;
 
     public GameObject spinee;
     public MeshRenderer mesh;
@@ -82,10 +83,11 @@ public class MoveCharacter : Character
     public MeshRenderer playerMesh;
     public Material[] playerMats;
     public Material[] playerOut;
-    public bool isInvisible;
     public bool canNotChangeHurt;
     public GameObject soulPrefab;
     public float soulStartSpeed = 1f;
+    public bool isInvisible;
+    public float invisibleTime;
 
     private void Awake()
     {
@@ -117,6 +119,10 @@ public class MoveCharacter : Character
     //0:漂浮 1:正常 2:无敌
     public void ChangeMat(int state)
     {
+        if((state == 0 && matState == 2) || (state == 2 && matState == 0))
+        {
+            return;
+        }
 
         if (outline1Mats.Length == 0)
         {
@@ -161,6 +167,7 @@ public class MoveCharacter : Character
             mesh = spinee.GetComponent<MeshRenderer>();
             mats = mesh.materials;
         }
+        print(state);
         switch (state)
         {
             case 0:
@@ -173,13 +180,14 @@ public class MoveCharacter : Character
                 mesh.materials = outline1Mats;
                 break;
         }
+        matState = state;
     }
 
     public void FloatStateOn()
     {
         if (!isTran)
         {
-            if (isInvincible)
+            if (isInvisible)
             {
                 return;
             }
@@ -332,27 +340,25 @@ public class MoveCharacter : Character
         //        ChangeMat(1);
         //    }
         //}
-        if (isInvincible)
+        
+        if (isInvisible)
         {
-            invincibleTime -= Time.deltaTime;
-            if(invincibleTime <= 0)
+            invisibleTime -= Time.deltaTime;
+            if(invisibleTime <= 0)
             {
-                isInvincible = false;
+                isInvisible = false;
+                ChangeMat(1);
             }
         }
     }
 
     public float easyToGetHit = 0.2f;
-    public bool isInvincible;
+    
 
     public override void BeHit(int damage, Vector3 force, bool changeHurt, float repelValue)
     {
         if (!isTran)
         {
-            if (isInvincible)
-            {
-                return;
-            }
             if (isInvisible)
             {
                 return;

+ 9 - 11
ActionTowerDefense/Assets/Scripts/PlayerController.cs

@@ -279,7 +279,6 @@ public class PlayerController : MoveCharacter
         PlayerInput playerInput = transform.GetComponent<PlayerInput>();
         spirits = GetComponent<Spirits>();
         playerId = playerInput.playerIndex;
-
         transform.position = new Vector3(142 + 4 * playerId, 0, 0);
         playerRope.playerId = playerId;
         sprintLinkTrigger.playerID = playerId;
@@ -357,6 +356,15 @@ public class PlayerController : MoveCharacter
         {
             bodyTrans.position = spiritObj.transform.position;
         }
+        if (isInvisible)
+        {
+            invisibleTime -= Time.deltaTime;
+            if (invisibleTime <= 0)
+            {
+                isInvisible = false;
+                ChangeMat(1);
+            }
+        }
     }
 
 
@@ -1499,11 +1507,6 @@ public class PlayerController : MoveCharacter
             Debug.LogError("δÅäÖÃ" + id + "ºÅ±äÉí");
             return;
         }
-        if (id == 3 && isInvisible)
-        {
-            isInvisible = false;
-            return;
-        }
         GameObject prefab = changePrefabs[id];
         ChangeState(CharacterState.Transfiguration);
         summonTime = prefab.GetComponent<Demonic>().totalSummonTime;
@@ -1621,11 +1624,6 @@ public class PlayerController : MoveCharacter
             Debug.LogError("δÅäÖÃ" + id + "ºÅʹħÕÙ»½Î»ÖÃ");
             return;
         }
-        if (id == 6 && isInvisible)
-        {
-            isInvisible = false;
-            return;
-        }
         GameObject prefab = demonicPrefabs[id];
         if (!CheckCanSummon(id))
         {

+ 3 - 4
ActionTowerDefense/Assets/Scripts/Spirits/InvisibleEffect.cs

@@ -7,7 +7,7 @@ public class InvisibleEffect : MonoBehaviour
     [HideInInspector]
     public ParticleSystem ps;
     public List<MoveCharacter> moveCharacters = new List<MoveCharacter>();
-    public float invincibleTime;
+    public float invisibleTime;
 
     private void Start()
     {
@@ -18,7 +18,6 @@ public class InvisibleEffect : MonoBehaviour
     {
         if (other.gameObject.layer == 7 || other.gameObject.layer == 6)
         {
-            
             MoveCharacter moveCharacter = other.GetComponentInParent<MoveCharacter>();
             if (moveCharacters.Exists(t => t == moveCharacter))
             {
@@ -33,9 +32,9 @@ public class InvisibleEffect : MonoBehaviour
                 }
                 moveCharacter = moveCharacter.pc;
             }
-            moveCharacter.isInvincible = true;
+            moveCharacter.isInvisible = true;
             moveCharacter.ChangeMat(2);
-            moveCharacter.invincibleTime = invincibleTime;
+            moveCharacter.invisibleTime = invisibleTime;
         }
     }
 

+ 216 - 2
ActionTowerDefense/Assets/Scripts/Spirits/Spirits_Invisible.cs

@@ -1,10 +1,39 @@
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
-
 public class Spirits_Invisible : MonoBehaviour
 {
     public bool notOut;
+    public Demonic demonic;
+    public InvisibleState state;
+    public Rigidbody rb;
+    public float moveSpeed;
+    public float findSoulSpeed;
+    public float minSpeed;
+    public float upSpeed;
+    [HideInInspector]
+    public float boomSpeed;
+    public float altitude;
+    public float randomRageY;
+    public float randomRageX;
+    [HideInInspector]
+    public float offsetY;
+    [HideInInspector]
+    public float offsetX;
+    [HideInInspector]
+    public Vector3 targetPos;
+    public float back;
+    [HideInInspector]
+    public int hp;
+    [HideInInspector]
+    public float posx;
+    [HideInInspector]
+    public Soul targetSoul;
+    public int followNumber;
+    [HideInInspector]
+    public int haveSoulNumber;
+    public SoulFollowEffect followEffect;
+    public float backSoulX;
     // Start is called before the first frame update
     void Start()
     {
@@ -12,11 +41,196 @@ public class Spirits_Invisible : MonoBehaviour
         {
             gameObject.SetActive(false);
         }
+        demonic.isNonAttack = true;
+        hp = demonic.hp;
     }
 
     // Update is called once per frame
     void Update()
     {
-        
+        Onstate();
+        if (demonic.hp <= 0)
+        {
+            ChangeState(InvisibleState.Die);
+        }
+    }
+    void Onstate()
+    {
+        Vector3 pos1;
+        Vector3 pos2;
+        switch (state)
+        {
+            case InvisibleState.Normal:
+
+                if (haveSoulNumber != followNumber && SoulInMap.souls.Count != 0)
+                {
+                    ChangeState(InvisibleState.FindSoul);
+                    return;
+                }
+                if (hp != demonic.hp)
+                {
+                    ChangeState(InvisibleState.Hurt);
+                    return;
+                }
+                posx = PlayersInput.instance[demonic.id].transform.position.x;
+                targetPos = new Vector3(posx + offsetX, altitude + offsetY, transform.position.z);
+                Goto(targetPos, moveSpeed);
+                if (Vector3.Distance(targetPos, transform.position) < 1)
+                {
+                    offsetY = Random.Range(-randomRageY, randomRageY);
+                    offsetX = Random.Range(-randomRageX, randomRageX);
+                }
+
+                break;
+            case InvisibleState.Hurt:
+                if (haveSoulNumber != followNumber && SoulInMap.souls.Count != 0)
+                {
+                    ChangeState(InvisibleState.FindSoul);
+                    return;
+                }
+                if (Vector3.Distance(targetPos, transform.position) < 1)
+                {
+                    ChangeState(InvisibleState.Normal);
+                    return;
+                }
+
+                Goto(targetPos, moveSpeed);
+                break;
+            case InvisibleState.FindSoul:
+                if (targetSoul.gameObject.activeSelf)
+                {
+                    pos1 = new Vector3(transform.position.x, transform.position.y, 0);
+                    pos2 = new Vector3(targetSoul.transform.position.x,
+                        targetSoul.transform.position.y, 0);
+                    if (Vector3.Distance(pos1, pos2) <= 1)
+                    {
+                        SoulInMap.souls.Remove(targetSoul);
+                        targetSoul.gameObject.SetActive(false);
+                        haveSoulNumber++;
+                        followEffect.ShowSouls(haveSoulNumber);
+                        if (haveSoulNumber == followNumber)
+                        {
+                            ChangeState(InvisibleState.FindPlayer);
+                            break;
+                        }
+                        FindSoul();
+                    }
+                }
+                else
+                {
+                    FindSoul();
+                }
+                if (targetSoul == null)
+                {
+                    ChangeState(InvisibleState.Normal);
+                    break;
+                }
+                targetPos = new Vector3(targetSoul.transform.position.x, targetSoul.transform.position.y,
+                    transform.position.z);
+
+                Goto(targetPos, findSoulSpeed);
+
+                break;
+            case InvisibleState.FindPlayer:
+                pos1 = new Vector3(transform.position.x, transform.position.y, 0);
+                pos2 = new Vector3(PlayersInput.instance[demonic.id].transform.position.x - backSoulX,
+                    PlayersInput.instance[demonic.id].transform.position.y + 0.5f, 0);
+                if (Vector3.Distance(pos1, pos2) <= 1)
+                {
+                    ChangeState(InvisibleState.Boom);
+                    break;
+                }
+                boomSpeed += Time.deltaTime * upSpeed;
+                Goto(PlayersInput.instance[demonic.id].transform.position + Vector3.up * 0.5f, boomSpeed);
+                break;
+            case InvisibleState.Boom:
+                ChangeState(InvisibleState.Normal);
+                break;
+            default:
+                break;
+        }
+    }
+    void ChangeState(InvisibleState newState)
+    {
+        switch (state)
+        {
+            case InvisibleState.Normal:
+                break;
+            case InvisibleState.Hurt:
+                break;
+            case InvisibleState.FindSoul:
+                break;
+            case InvisibleState.FindPlayer:
+                break;
+            case InvisibleState.Boom:
+                break;
+            default:
+                break;
+        }
+        switch (newState)
+        {
+            case InvisibleState.Normal:
+                hp = demonic.hp;
+                offsetY = Random.Range(-randomRageY, randomRageY);
+                offsetX = Random.Range(-randomRageX, randomRageX);
+                break;
+            case InvisibleState.Hurt:
+                posx = transform.position.x;
+                targetPos = new Vector3(posx + offsetX + back, altitude + offsetY, transform.position.z);
+
+                break;
+            case InvisibleState.FindSoul:
+                FindSoul();
+                break;
+            case InvisibleState.FindPlayer:
+                boomSpeed = minSpeed;
+                break;
+            case InvisibleState.Boom:
+                rb.velocity = Vector3.zero;
+                followEffect.ShowSouls(0);
+                followEffect.Boom();
+                haveSoulNumber = 0;
+                break;
+            case InvisibleState.Die:
+                demonic.isDie = true;
+                demonic.dieKeepTime = demonic.totalDieKeepTime;
+                gameObject.SetActive(false);
+                break;
+            default:
+                break;
+        }
+        state = newState;
+    }
+    public void Goto(Vector3 pos, float speed)
+    {
+        Vector3 target = (pos - transform.position).normalized;
+        rb.velocity = target * speed;
+    }
+    public void FindSoul()
+    {
+        Vector3 pos1;
+        Vector3 pos2;
+        List<Soul> souls = SoulInMap.souls;
+        if (souls.Count == 0)
+        {
+            targetSoul = null;
+            return;
+        }
+        pos1 = new Vector3(souls[0].transform.position.x, souls[0].transform.position.y, 0);
+        pos2 = new Vector3(transform.position.x, transform.position.y, 0);
+        float minDistance = Vector3.Distance(pos1, pos2);
+        int targetSoulId = 0;
+        for (int i = 1; i < souls.Count; i++)
+        {
+            pos1 = new Vector3(souls[i].transform.position.x, souls[i].transform.position.y, 0);
+            pos2 = new Vector3(transform.position.x, transform.position.y, 0);
+            float distance = Vector3.Distance(pos1, pos2);
+            if (distance < minDistance)
+            {
+                minDistance = distance;
+                targetSoulId = i;
+            }
+        }
+        targetSoul = souls[targetSoulId];
     }
 }

+ 5 - 0
ActionTowerDefense/Assets/Scripts/Spirits/Trans_Invisible.cs

@@ -43,6 +43,7 @@ public class Trans_Invisible : MonoBehaviour
         player = transform.GetComponentInParent<PlayerController>();
         player.canfly = true;
         player.maxFlyHeight = maxFlyHeight;
+        player.isInvisible = true;
 
         //playerController.changeTime = changeTime;
         //playerController.uiHp.gameObject.SetActive(false);
@@ -73,6 +74,10 @@ public class Trans_Invisible : MonoBehaviour
             
         }
     }
+    private void OnDisable()
+    {
+        player.canfly = false;
+    }
     /*
     private void Update()
     {