コード例 #1
0
ファイル: AniFx.cs プロジェクト: tongxingyang/TanksBattle
    //每一帧有且只有一次被更新
    //frame 当前帧
    //loopCount 当前第几次动作循环
    //trueframe 真实达到第几帧的
    //end 真实是不是结束
    //root 用于创建的时候计算位置用
    public void UpdateFrame(int frame, int loop, bool isEnd, Transform root)
    {
        //检查销毁
        if (endFrame > 0 && beginFrame + endFrame == frame && fxs.Count != 0)
        {
            Destroy();
        }

        if (frame != beginFrame)
        {
            return;                    //不是这一帧
        }
        if (prefab == null)
        {
            return;
        }
        if (loop > 0 && !loopCreate)
        {
            return;                         //已经循环过一次就不用创建了
        }
        if (isEnd && (destroyIfAniEnd))
        {
            return;                             //如果是动作结束销毁的,那么就不用创建了
        }
#if !ART_DEBUG
        //调试
        if (onRuntimeCreate == null && canHide && !QualityMgr.instance.roleAniFx)
        {
            return;
        }
#endif

        //不同元素属性创建不同特效
        GameObject curPrefab = prefab;
        switch (this.parent.RuntimeElement)
        {
        case enAniFxElement.none: curPrefab = prefab; break;

        case enAniFxElement.fire: curPrefab = prefabFire; break;

        case enAniFxElement.ice: curPrefab = prefabIce; break;

        case enAniFxElement.thunder: curPrefab = prefabThunder; break;

        case enAniFxElement.dark: curPrefab = prefabDark; break;

        default: Debuger.LogError("动作特效 未知的元素类型:{0}", this.parent.RuntimeElement); break;
        }
        if (curPrefab == null)
        {
            curPrefab = prefab;
        }

        //1 创建特效
        GameObject go = GameObjectPool.GetPool(GameObjectPool.enPool.Fx).GetImmediately(curPrefab.name, false);
        if (go == null)
        {
            //Debuger.LogError("逻辑错误动作绑定特效加载后为空");//这里只支持预加载,不支持异步加载,没有预加载过报错
            return;
        }

        //2 设置位置和方向
        Transform t = go.transform;
        if (type == enCreateType.bone)//绑定骨骼
        {
            Transform target = GetTarget(root);
            if (follow)
            {
                t.SetParent(target, false);
                //t.localScale = Vector3.one;
                t.localPosition    = offset;
                t.localEulerAngles = euler;
            }
            else
            {
                t.position = target.TransformPoint(offset);
                t.rotation = target.rotation * Quaternion.Euler(euler);
            }
        }
        else if (type == enCreateType.matrial)//绑定材质
        {
            Transform target = root.Find("model/body_mesh");
            if (target != null)
            {
                t.SetParent(target, false);
                //t.localScale = Vector3.one;
                t.localPosition    = Vector3.zero;
                t.localEulerAngles = Vector3.zero;
            }

            target = root.Find("model/weapon_mesh");
            if (target != null)
            {
                GameObject go2 = GameObjectPool.GetPool(GameObjectPool.enPool.Fx).GetImmediately(prefab.name, false);
                Transform  t2  = go2.transform;
                t2.SetParent(target, false);
                t2.localPosition    = Vector3.zero;
                t2.localEulerAngles = Vector3.zero;
                go2.SetActive(true);//设好了父节点了,这个时候再SetActive
                fxs.Add(go2);
            }
        }
        else
        {
            Debuger.LogError("未知的类型:{0}", type);
        }
        go.SetActive(true);//设好了父节点了,这个时候再SetActive

        //如果飞出物上没有任何销毁的脚本,那么提示下
        if (!destroyIfAniEnd && endFrame <= 0 && !FxDestroy.HasDelay(go))
        {
            Debuger.LogError("动作特效上没有绑销毁脚本,动作上也没有指定结束帧.特效名:{0}", go.name);
        }

        //加到列表中,方便管理
        fxs.Add(go);



        //运行时创建回调
        if (onRuntimeCreate != null)
        {
            onRuntimeCreate(go, onRuntimeCreateParam);
        }
    }