| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- using UnityEngine;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- public class Effect
- {
- static int mAutoIncInstanceId = 1;
- #region Fields
- EffectData mData;
- GameObject mEffectGO;
- Transform mOwnerTransform;
- Transform mTargetTransform;
- Transform mBulletTransform;
- float mLifeTime;
- bool ignoreTimeScale = false;
- bool fixFloor = false;
- int lookType = 0;
- bool mirrorable = true;
- string mForceLayer = string.Empty;
- #endregion
- #region Properties
- public int InstanceID { get; private set; }
- public int EffectID { get { return mData.id; } }
- public float MaxLifeTime { get { return mData.lifeTime; } }
- public bool Valid { get { return mData != null && mData.valid; } }
- public EffectFollowType FollowType { get { return mData.followTargetType; } }
- public EffectTargetType TargetType { get { return mData.targetType; } }
- public GameObject EffectGo { get { return mEffectGO; } }
- public bool IsPaused { get; private set; }
- public bool IsDisposed { get; private set; }
- public Transform OwnerTransform { get { return mOwnerTransform; } }
- public Transform TargetTransform { get { return mTargetTransform; } }
-
- public Fighter OwnerFighter {get { return GetTransformFighter (mOwnerTransform);}}
- public Fighter TargetFighter {get { return GetTransformFighter (mTargetTransform);}}
- #endregion
- public Effect (EffectData data)
- {
- InstanceID = mAutoIncInstanceId++;
- mData = data;
- IsPaused = false;
- IsDisposed = false;
- mLifeTime = 0;
- }
- public void Play (Transform selfTransform, Transform targetTransform = null, Transform bulletTransform = null
- , bool ignoreTimescale = false, bool fixFloor = false, int lookType = 0, bool mirrorable = true, string forceLayer = "")
- {
- mOwnerTransform = selfTransform;
- mTargetTransform = targetTransform;
- mBulletTransform = bulletTransform;
- this.ignoreTimeScale = ignoreTimescale;
- this.fixFloor = fixFloor;
- this.lookType = lookType;
- this.mirrorable = mirrorable;
- this.mForceLayer = forceLayer;
- Initialze ();
- }
- public void Pause ()
- {
- if (IsPaused)
- return;
- UnityEngineUtils.PauseEffectParticle (mEffectGO);
- IsPaused = true;
- }
- public void ResumeFromPause ()
- {
- if (!IsPaused)
- return;
- UnityEngineUtils.ResumeEffectParticle (mEffectGO);
- IsPaused = false;
- }
- public void Update (float deltaTime)
- {
- if (IsPaused) {
- return;
- }
- mLifeTime += deltaTime;
- UpdateFollowFloorPosition ();
- if (mEffectGO == null || (mData.lifeTime > 0 && mLifeTime > MaxLifeTime))
- EffectManager.Instance.RemoveEffectByInstanceID (InstanceID);
- }
- void CreateEffectGo ()
- {
- if (mEffectGO != null)
- return;
- if (string.IsNullOrEmpty(mData.effect)) return;
- mEffectGO = EffectManager.Instance.CreateEffectGo(mData.effect);
- if (mEffectGO == null)
- {
- //DebugHelper.LogError("effect go is null" + mData.effect);
- return;
- }
- mEffectGO.name = mData.effect;
- if (ignoreTimeScale)
- UnityEngineUtils.SetUnscalTimePartical (mEffectGO);
-
- if (mData.followTargetType == EffectFollowType.Effect_Follow_Camera_Back)
- CommonUtil.SetGameObjectLayer (mEffectGO, BattleCamera.BackScreenLayerName);
- else if (mOwnerTransform != null) {
- if (!string.IsNullOrEmpty (mForceLayer))
- CommonUtil.SetGameObjectLayer (mEffectGO, mForceLayer);
- else if (mData.followTargetType == EffectFollowType.Effect_Follow_Camera_Normal)
- CommonUtil.SetGameObjectLayer (mEffectGO, BattleCamera.SceneEffectLayerName);
- else
- CommonUtil.SetGameObjectLayer (mEffectGO, BattleCamera.CurrentEffectLayerName);
- }
- }
- void SetFollowParent ()
- {
- if (mEffectGO == null)
- return;
- if (mData.followTargetType == EffectFollowType.Effect_Follow_None)
- {
- mEffectGO.transform.SetParent(null);
- return;
- }
- if (mData.followTargetType == EffectFollowType.Effect_Follow_Self
- || mData.followTargetType == EffectFollowType.Effect_Follow_Self_Bloodbar
- || mData.followTargetType == EffectFollowType.Effect_Follow_Self_Floor)
- {
- AttachTransform (mOwnerTransform, mEffectGO.transform, mData.targetObjName);
- }
- else if (mData.followTargetType == EffectFollowType.Effect_Follow_Target
- || mData.followTargetType == EffectFollowType.Effect_Follow_Target_Bloodbar
- || mData.followTargetType == EffectFollowType.Effect_Follow_Target_Floor)
- {
- AttachTransform (mTargetTransform, mEffectGO.transform, mData.targetObjName);
- }
- else if (mData.followTargetType == EffectFollowType.Effect_Follow_Camera_Back
- || mData.followTargetType == EffectFollowType.Effect_Follow_Camera_Normal)
- {
- if (BattleCamera.Instance != null)
- mEffectGO.transform.SetParent (BattleCamera.Instance.RealCamera.transform);
- }
- mEffectGO.transform.localPosition = new Vector3 (0f, 0f, 0f);
- mEffectGO.transform.localEulerAngles = mData.rot;
- mEffectGO.transform.localScale = new Vector3 (1f, 1f, 1f);
- UpdateFollowFloorPosition ();
- }
- void AttachTransform (Transform tParent, Transform tChild, string name)
- {
- var attachParent = UnityEngineUtils.RecurisiveFindTransformChild (tParent, name);
- if (attachParent == null)
- attachParent = tParent;
- tChild.SetParent (attachParent);
- }
- void SyncPosition (Transform toSync, Transform targetTransform, string name)
- {
- if (toSync == null || targetTransform == null)
- return;
- Transform t = UnityEngineUtils.RecurisiveFindTransformChild (targetTransform, name);
- toSync.position = t != null ? targetTransform.TransformPoint (targetTransform.InverseTransformPoint (t.position)) : targetTransform.TransformPoint (Vector3.zero);
- }
- void SetTargetPosition ()
- {
- if (mEffectGO == null)
- return;
- //如果设置了跟随,忽略目标属性
- if (mData.followTargetType != EffectFollowType.Effect_Follow_None)
- return;
- LookAtOwnerForward ();
- mEffectGO.transform.localPosition = Vector3.zero;
- mEffectGO.transform.localEulerAngles = mData.rot;
- mEffectGO.transform.localScale = Vector3.one;
- if (mData.targetType == EffectTargetType.Effect_Target_Self || mData.targetType == EffectTargetType.Effect_Target_Self_Floor) {
- SyncPosition (mEffectGO.transform, mOwnerTransform, mData.targetObjName);
- } else if (mData.targetType == EffectTargetType.Effect_Target_Target || mData.targetType == EffectTargetType.Effect_Target_Target_Floor) {
- SyncPosition (mEffectGO.transform, mTargetTransform, mData.targetObjName);
- } else if (mData.targetType == EffectTargetType.Effect_Target_Bullet) {
- SyncPosition (mEffectGO.transform, mBulletTransform, mData.targetObjName);
- } else if (mData.targetType == EffectTargetType.Effect_Target_To_Self)
- {
- if (mOwnerTransform != null && mTargetTransform != null) {
- MoveFromToWithTransform moveFromTo = mEffectGO.GetComponent<MoveFromToWithTransform> (true);
- mEffectGO.transform.position = mTargetTransform.position;
- moveFromTo.from = mTargetTransform;
- moveFromTo.to = mOwnerTransform;
- moveFromTo.enabled = true;
- }
- return;
- } else if (mData.targetType == EffectTargetType.Effect_Self_To_Target)
- {
- if (mOwnerTransform != null && mTargetTransform != null) {
- MoveFromToWithTransform moveFromTo = mEffectGO.GetComponent<MoveFromToWithTransform> (true);
- mEffectGO.transform.position = mOwnerTransform.position;
- moveFromTo.from = mOwnerTransform;
- moveFromTo.to = mTargetTransform;
- moveFromTo.enabled = true;
- }
- return;
- }
- }
- void LookAtOwnerForward()
- {
- if (mEffectGO == null)
- return;
- if (mOwnerTransform != null)
- mEffectGO.transform.LookAt (mEffectGO.transform.position + mOwnerTransform.position);
- }
- void SetLocalTransform ()
- {
- if (mEffectGO == null)
- return;
- if (mData.followTargetType != EffectFollowType.Effect_Follow_None)
- {
- if (mData.followTargetType == EffectFollowType.Effect_Follow_Self_Bloodbar) {
- Fighter fighter = GetTransformFighter (mOwnerTransform);
- if (fighter != null)
- mEffectGO.transform.localPosition += fighter.Actor.AvatarData.bloodBarPos.y * Vector3.up;
- } else if (mData.followTargetType == EffectFollowType.Effect_Follow_Target_Bloodbar) {
- Fighter fighter = GetTransformFighter (mTargetTransform);
- if (fighter != null)
- mEffectGO.transform.localPosition += fighter.Actor.AvatarData.bloodBarPos.y * Vector3.up;
- }
- }
- }
- Fighter GetTransformFighter (Transform t)
- {
- if (t == null)
- return null;
- FighterGoCtrl fighterCtrl = t.GetComponent<FighterGoCtrl> ();
- return fighterCtrl == null ? null : fighterCtrl.Fighter;
- }
- void SetFloorPosition ()
- {
- if (mEffectGO == null)
- return;
- if (mData.followTargetType == EffectFollowType.Effect_Follow_None
- && (mData.targetType == EffectTargetType.Effect_Target_Self_Floor || mData.targetType == EffectTargetType.Effect_Target_Target_Floor)
- && BattleMgr.Instance != null && BattleMgr.Instance.Battle.CurBattleField != null)
- mEffectGO.transform.position = mEffectGO.transform.position.SetY (BattleMgr.Instance.Battle.CurBattleField.FloorY);
- }
- void UpdateFollowFloorPosition()
- {
- if (mEffectGO == null)
- return;
- if ((mData.followTargetType == EffectFollowType.Effect_Follow_Self_Floor || mData.followTargetType == EffectFollowType.Effect_Follow_Target_Floor)
- && BattleMgr.Instance != null && BattleMgr.Instance.Battle.CurBattleField != null)
- mEffectGO.transform.position = mEffectGO.transform.position.SetY (BattleMgr.Instance.Battle.CurBattleField.FloorY);
- }
- void SetLookAt ()
- {
- if (lookType == 1 && mTargetTransform != null) {
- mEffectGO.transform.LookAt (mTargetTransform.position);
- }
- }
- void SetUnscalTimePartical ()
- {
- if (mEffectGO == null)
- return;
- UnityEngineUtils.SetUnscalTimePartical (mEffectGO);
- }
- void Show ()
- {
- if (mEffectGO != null)
- mEffectGO.SetActive (true);
- }
- void Initialze ()
- {
- CreateEffectGo ();
- SetFollowParent ();
- SetTargetPosition ();
- SetLocalTransform ();
- SetFloorPosition ();
- SetLookAt ();
- Show ();
- }
- public void Hide ()
- {
- if (EffectGo != null)
- CommonUtil.SetGameObjectLayer (EffectGo, BattleCamera.DisableLayerName);
- }
- public void UnHide ()
- {
- if (EffectGo != null) {
- if (mData.followTargetType == EffectFollowType.Effect_Follow_Camera_Back)
- CommonUtil.SetGameObjectLayer (mEffectGO, BattleCamera.BackScreenLayerName);
- else if (mOwnerTransform != null) {
- if (!string.IsNullOrEmpty (mForceLayer))
- CommonUtil.SetGameObjectLayer (mEffectGO, mForceLayer);
- else
- CommonUtil.SetGameObjectLayer (mEffectGO, BattleCamera.CurrentEffectLayerName);
- }
- }
- }
- public void SetScale(float scale)
- {
- if(EffectGo != null)
- {
- EffectGo.transform.localScale = new Vector3(scale, scale, scale);
- }
- }
- public void Dispose()
- {
- if (IsDisposed)
- return;
- if (mEffectGO != null)
- {
- ResourceMgr.Instance.RecycleGO(Constants.EffectPath, mData.effect, mEffectGO);
- mEffectGO = null;
- }
- IsDisposed = true;
- }
- public void Destroy()
- {
- Dispose();
- mData = null;
- mOwnerTransform = null;
- mTargetTransform = null;
- mBulletTransform = null;
- }
- }
|