• EffectManager


    using UnityEngine;
    using System.Collections;
    
    public class EffectManager : MonoBehaviour {
    
        public Animator[]  Animators;
        public float amplify;
        public float curAmplify;
        public float totalEffectDelayTime;
        public Transform MoveTarget;
    
        public ParticleEffect particleEffect;
        public AnimatorOffsetChangeEffect animatorOffsetChangeEffect;
        public AnimatorMeshChangeEffect animatorMeshChangeEffect;
        public enum EffectType
        {
            Particles,
            AnimatorOffsetChange,
            AnimatorMeshChange
        }
    
        public EffectType effectType;
    
        void Start ()
        {
            SetEffectSpeed();
            EffectMoveToTarget();
        }
        
        void Update ()
        {
    
        }
    
        void OnEnable()
        {
            if (animatorOffsetChangeEffect.middleEffectNode.rootNode != null)
            {
                animatorOffsetChangeEffect.middleEffectNode.rootNode.transform.position =
                    animatorOffsetChangeEffect.frontEffectNode.rootNode.transform.position;
                animatorOffsetChangeEffect.middleEffectNode.rootNode.SetActive(true);
            }
            Start();
        }
    
        private bool isFirst = true;
        public void SetEffectSpeed()
        {
            //for (int i = 0; i < ParticlesSetStartDelay.Length; i++) {
            //    ParticlesSetStartDelay[i].startDelay /=amplify;
            //}
    
            //for (int i = 0; i < ParticlesSetDuration.Length; i++) {
            //    ParticlesSetDuration[i].startLifetime /=amplify;
            //}
    
            if (isFirst)
            {
                isFirst = false;
            }
            else
                return;
            Effect effect;
    
            if (effectType == EffectType.Particles)
            {
                 effect = particleEffect;
                if (effect.middleEffectNode != null)
                {
                    for (int i = 0; i < effect.middleEffectNode.Particles.Length; i++)
                    {
                        effect.middleEffectNode.Particles[i].startSpeed *= amplify;
                    }
                }
    
            }
            else if (effectType == EffectType.AnimatorOffsetChange)
            {
    
                effect = animatorOffsetChangeEffect;
                for (int i = 0; i < Animators.Length; i++)
                {
                    Animators[i].speed *= amplify;
                }
                if (effect.middleEffectNode != null)
                {
                    effect.middleEffectNode.durationTime /= amplify;
                    effect.middleEffectNode.startDelayTime /= amplify;
                }
    
            }
            else
            {
                effect = animatorMeshChangeEffect;
                for (int i = 0; i < Animators.Length; i++)
                {
                    Animators[i].speed *= amplify;
                }
    
            }
            if (effect.frontEffectNode != null)
            {
                for (int i = 0; i < effect.frontEffectNode.Particles.Length; i++)
                {
                    effect.frontEffectNode.Particles[i].startDelay /= amplify;
                    effect.frontEffectNode.Particles[i].startLifetime /= amplify;
                }
            }
            if (effect.lastEffectNode != null)
            {
                for (int i = 0; i < effect.lastEffectNode.Particles.Length; i++)
                {
                    effect.lastEffectNode.Particles[i].startDelay /= amplify;
                    effect.lastEffectNode.Particles[i].startLifetime /= amplify;
                }
            }
        }
    
        public void EffectMoveToTarget()
        {
            if (effectType == EffectType.Particles)
            {
                particleEffect.EffectMoveToTarget(MoveTarget);
            }
            else if (effectType == EffectType.AnimatorOffsetChange)
            {
                animatorOffsetChangeEffect.EffectMoveToTarget(MoveTarget);
            }
            else
            {
                animatorMeshChangeEffect.EffectMoveToTarget(MoveTarget);
            }
            //Debug.Log(frontEffectTime);
            //Hashtable args = new Hashtable();
            //args.Add("position", MoveTarget.position);
            //args.Add("time", middleEffectTime);
            //args.Add("delay", frontEffectTime);
            //args.Add("easeType", iTween.EaseType.easeInQuad);
    
    
            ////args.Add("isLocal", true);
            //iTween.MoveTo(MiddleEffect, args);
            //LastEffect.transform.position = MoveTarget.transform.position;
        }
        private void middleEffectNodeReachEvent()
        {
            animatorOffsetChangeEffect.middleEffectNode.rootNode.SetActive(false);
        }
    }
    
    [System.Serializable]
    public class EffectNode
    {
        public GameObject rootNode;
        public ParticleSystem[]  Particles;
        public float startDelayTime;
        public float durationTime;
    }
    
    public abstract class Effect
    {
        public EffectNode frontEffectNode;
        public EffectNode middleEffectNode;
        public EffectNode lastEffectNode;
    
        public abstract void EffectMoveToTarget(Transform target);
    
    }
    
    [System.Serializable]
    public class AnimatorOffsetChangeEffect : Effect
    {
        public override void EffectMoveToTarget(Transform target)
        {
            //middleEffectNode.rootNode.transform.LookAt(target);
            Hashtable args = new Hashtable();
            args.Add("position", target.position);
            args.Add("time", middleEffectNode.durationTime);
            args.Add("delay", middleEffectNode.startDelayTime);
            args.Add("easeType", iTween.EaseType.linear);
            //args.Add("looktarget", target.position);
            if (isHideMiddle)
            {
                args.Add("oncomplete", "middleEffectNodeReachEvent");
                args.Add("oncompletetarget", frontEffectNode.rootNode.transform.parent.gameObject);
            }
            iTween.MoveTo(middleEffectNode.rootNode, args);
            lastEffectNode.rootNode.transform.position = target.position;
        }
    
        public bool isHideMiddle;
    }
    
    
    [System.Serializable]
    public class ParticleEffect : Effect
    {
        public override void EffectMoveToTarget(Transform target)
        {
            middleEffectNode.rootNode.transform.LookAt(target);
            float dis = Vector3.Distance(frontEffectNode.rootNode.transform.position, target.position);
            middleEffectNode.Particles[0].startSpeed = dis / middleEffectNode.durationTime;
            lastEffectNode.rootNode.transform.position = target.position;
        }
    }
    
    [System.Serializable]
    public class AnimatorMeshChangeEffect : Effect
    {
        public override void EffectMoveToTarget(Transform target)
        {
            Vector3 dirV = (target.position - middleEffectNode.rootNode.transform.position).normalized;
            middleEffectNode.rootNode.transform.right = dirV;
            lastEffectNode.rootNode.transform.position = target.position;
    
        }
    }
    using UnityEngine;
    using System.Collections;
    
    public class ShowParticleCout : MonoBehaviour {
        //定义发射器组件
        //粒子数量接受变量
        ParticleSystem a = null;
        public int banjing=0;
        int a_particleCout=0;
        // Use this for initialization
        void Start () {
        a = GetComponent<ParticleSystem>();
        }
        
        // Update is called once per frame
        void Update () {
            if(a !=null){
                //Debug.Log("粒子数:"+ a.particleCount);
                a_particleCout=a.particleCount;
            }
        }
        public int getParticleCout(){
            //返回粒子数
            return a_particleCout;
        }
        void OnGUI() {
            string showParticleCout = "粒子数是:" + a_particleCout;
            GUI.Label(new Rect(10, 10,showParticleCout.Length * 20 , 40),showParticleCout +"
     asdfasdfa" );
        }
    
    }
    using UnityEngine;
    using System.Collections;
    
    public class Delay : MonoBehaviour {
        
        public float delayTime = 1.0f;
        
        // Use this for initialization
        void Start () {        
            gameObject.SetActiveRecursively(false);
            Invoke("DelayFunc", delayTime);
        }
        
        void DelayFunc()
        {
            gameObject.SetActiveRecursively(true);
        }
        
    }
  • 相关阅读:
    清北学堂模拟赛d1t5 拍照(photo)
    清北学堂模拟赛d1t4 一道图论好题(graph)
    清北学堂模拟赛d1t3 听音乐(music)
    Android(java)学习笔记167:横竖屏切换时Activity的生命周期
    Android(java)学习笔记166:上下文的区分
    Android(java)学习笔记165:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例的优化:请求码和结果码)
    Android(java)学习笔记164:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例)
    Android(java)学习笔记163:开发一个多界面的应用程序之界面间数据传递
    Android(java)学习笔记162:开发一个多界面的应用程序之两种意图
    Java基础知识强化19:Java中switch分支语句
  • 原文地址:https://www.cnblogs.com/123ing/p/3976933.html
Copyright © 2020-2023  润新知