コード例 #1
0
ファイル: EffectHelper.cs プロジェクト: zwong91/Titan
    public static bool Play(ref U3D_Render.EntityView ev, int effectID, cmd_creature_skillview cmdInfo)
    {
        //光效开关
        if (!Initialize.Instance || !OptimitzedControlPlane.Instance.EnabledLightingEffect)
        {
            return(true);
        }

        LightEffectParam param = new LightEffectParam();

        param.nFeedbackID     = cmdInfo.nFeedBackID;
        param.bIsHero         = ev.IsHero;
        param.nSrcEntityID    = ev.ID;
        param.nTargetEntityID = cmdInfo.nTargetEntityID;
        param.srcObject       = ev.gameObject;
        param.nCreatorSide    = cmdInfo.nCreatorSide;
        if (cmdInfo.nSrcEntityID > 0)
        {
            param.nSrcEntityID = cmdInfo.nSrcEntityID;
            param.srcObject    = EntityFactory.getEntityGameObjectByID(cmdInfo.nSrcEntityID);
        }
        param.fDistance    = cmdInfo.fDistance;
        param.fAttackRange = cmdInfo.fAttackRange;
        param.speed        = cmdInfo.fPASD;
        if (cmdInfo.nTargetEntityID != 0)
        {
            param.targetObject = EntityFactory.getEntityGameObjectByID(cmdInfo.nTargetEntityID);
        }
        param.targetPos = new Vector3(cmdInfo.fTargetPos_x, cmdInfo.fTargetPos_y, cmdInfo.fTargetPos_z);
        if (cmdInfo.bFlyToTargetPos != 0)
        {
            param.nEffectFlag |= (int)LightEffectParam.EFFECT_FLAG.FlyToTargetPos;
        }

        param.sourcePos = new Vector3(cmdInfo.fSrcPos_x, cmdInfo.fSrcPos_y, cmdInfo.fSrcPos_z);
        if (cmdInfo.bFromSrcPos != 0)
        {
            param.nEffectFlag |= (int)LightEffectParam.EFFECT_FLAG.CustomSourcePos;
        }

        LightingEffectManager manager = ev.LightingEffectManager;

        if (manager == null)
        {
            return(false);
        }

        // 开始光效
        manager.AddLighting(effectID, param);

        // 输出光效信息
        if (manager.showLog)
        {
            Trace.Log("Add Lighting" + effectID + ". Entity Id=" + ev.ID + " SrcID=" + param.nSrcEntityID);
            Trace.Log("TargetID=" + cmdInfo.nTargetEntityID + ". TargetPos=(" + cmdInfo.fTargetPos_x + "," + cmdInfo.fTargetPos_y + "," + cmdInfo.fTargetPos_z + ").");
        }

        return(true);
    }
コード例 #2
0
    /// <summary>
    /// 播放开头动画(最快下一帧开始播放)
    /// </summary>
    private void PlayBattleMovie()
    {
        LightingEffectManager lem = EntityFactory.EffectGroup.GetComponent <LightingEffectManager>();

        if (lem != null)
        {
            LightEffectParam param = new LightEffectParam();
            param.srcObject = MainHerpObj;
            param.sourcePos = MainHerpObj.transform.position;
            param.targetPos = MainHerpObj.transform.position;

            lem.AddLighting(343, param);
            //lem.RegisterEffectComplete(343, OnMovieFinished);
        }
        LightingEffectManager lem2 = EntityFactory.GloabaleManager;

        if (lem2 != null)
        {
            EffectHelper.Play(ref MainHerpEv, 333, MainHerpEv.ID, 0, MainHerpObj.transform.position);
            lem2.RegisterEffectStart(333, OnMovieStart);
            lem2.RegisterEffectComplete(333, OnMovieFinished);
        }
    }
コード例 #3
0
ファイル: MouseCtrl.cs プロジェクト: zwong91/Titan
    private void OnAICommand()
    {
        int targetID = 0;

        if (raycast.targetID > 0)
        {
            EntityView evTarget       = EntityFactory.getEntityViewByID(raycast.targetID);
            EntityView evMainHeroView = EntityFactory.MainHeroView;
            if (evTarget != null && evTarget.IsValid)
            {
                if (evTarget.CampFlag == CampFlag.CampFlag_Friend && evTarget.Type == ENTITY_TYPE.TYPE_PLAYER_ROLE)
                {
                    // 1.发送服务器要(1)控制或(2)解除或   暂时没有该功能//(3)移交targetID的友方英雄单位
                    if (evTarget.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_AI_SCHEME_ID) > 0)
                    {
                        targetID = raycast.targetID;
                        if (!LogicDataCenter.teamRightWndDataManager.MyTeamUIDTable.ContainsKey(targetID))
                        {
                            return;
                        }
                        TeamRightInfo teamRightInfo = LogicDataCenter.teamRightWndDataManager.MyTeamUIDTable[targetID] as TeamRightInfo;

                        int       groundLightEffectID     = 0;
                        const int helpmeSignLightEffectID = 13;
                        const int dangerSignLightEffectID = 12;
                        if (LogicDataCenter.teamRightWndDataManager.BIsJoinFollow[teamRightInfo.nSlotId])
                        {
                            cmd_war_ai_command_break_follow data = new cmd_war_ai_command_break_follow();
                            data.uidTarget = targetID;
                            EntityEventHelper.Instance.SendCommand <cmd_war_ai_command_break_follow>(EntityFactory.MainHeroID, EntityLogicDef.ENTITY_CMD_AI_COMMAND_BREAK_FOLLOW, ref data);

                            groundLightEffectID = dangerSignLightEffectID;
                        }
                        else
                        {
                            cmd_war_ai_command_follow data = new cmd_war_ai_command_follow();
                            data.uidTarget = targetID;
                            EntityEventHelper.Instance.SendCommand <cmd_war_ai_command_follow>(EntityFactory.MainHeroID, EntityLogicDef.ENTITY_CMD_AI_COMMAND_FOLLOW, ref data);

                            groundLightEffectID = helpmeSignLightEffectID;
                        }
                        LogicDataCenter.teamRightWndDataManager.BIsJoinFollow[teamRightInfo.nSlotId] = !LogicDataCenter.teamRightWndDataManager.BIsJoinFollow[teamRightInfo.nSlotId];

                        // 添加地面光效
                        Vector3 pos = new Vector3();
                        if (MouseRaycastToGround(ref pos))
                        {
                            int        LayerMaskOnPos   = (1 << LayerMask.NameToLayer(Config.LayerDefault) | 1 << LayerMask.NameToLayer(Config.LayerBuilding));
                            Ray        PointToGroundRay = new Ray(pos + new Vector3(0, 0.5f, 0), new Vector3(0, -1, 0));
                            RaycastHit projectInfo;
                            Physics.Raycast(PointToGroundRay, out projectInfo, 100, LayerMaskOnPos);
                            pos = projectInfo.point;

                            LightEffectParam param = new LightEffectParam();
                            param.nSrcEntityID = evMainHeroView.ID;
                            param.sourcePos    = pos;
                            param.targetPos    = pos;
                            LightingEffectManager lem = evMainHeroView.LightingEffectManager;
                            if (lem != null && lem)
                            {
                                lem.AddLighting(groundLightEffectID, param);
                            }
                        }
                    }
                }
            }
        }
    }
コード例 #4
0
    ////-----------------------------------------------------------------------------------------------------
    ////以下部分主要处理光效跟动作配合的时候,需要检查状态机切换再开始光效的功能
    ////-----------------------------------------------------------------------------------------------------
    //private List<LightingEffect> mDelayEffectList; //延迟挂接的光效,等到状态切换后再开始挂接
    //private int lastestStateNameHash = 0;
    //private void dealWithStateEffect()
    //{
    //    if (animator == null)
    //    {
    //        animator = transform.GetComponent<Animator>();
    //    }

    //    if (animator == null)
    //    {
    //        return;
    //    }
    //    if (animator.layerCount < 2)
    //    {
    //        return;
    //    }
    //    AnimatorStateInfo sta = animator.GetCurrentAnimatorStateInfo(1);
    //    int currentStateNameHash = sta.nameHash;
    //    if (currentStateNameHash == lastestStateNameHash)
    //    {
    //        return;
    //    }

    //    //切换动作了!这里nameHash只做切换时间点的判断,用nameHash和effect.waitState对比老是失败
    //    lastestStateNameHash=currentStateNameHash;
    //    foreach (LightingEffect effect in mDelayEffectList)
    //    {
    //        if (sta.IsName(effect.getWaitState()))
    //        {
    //            if (effect.Begin())
    //            {
    //                mEffectList.Add(effect);
    //            }
    //        }
    //    }

    //    //目前暂定切一次动作就清空一次延迟光效的记录,也就是说光效只能延迟一个动作挂接
    //    mDelayEffectList.Clear();
    //}



    // 添加一个光效
    // @param nID : 光效ID
    // @param nSrcEntityID : 光效源对象ID
    // @param targetObject : 目标对象,可以为空
    // @param targetPos : 目标位置,可以为空
    // @param isHero : 是否是游戏玩家控制的主角
    // @param nFeedbackID : 逻辑层传的ID标识,用于标记、删除和碰撞是返回标识。

    public LightingEffectBehavior AddLightingImpl(int nID, LightEffectParam param)
    {
        //远距离不创建分情况考虑,具体在LightingEffect实现
        //if (LightingEffectFactory.Instance.IsEnabledOptimize())
        //{
        //    //距离超过创建距离,不创建光效了。
        //    Vector3 dis = Initialize.mainCam.transform.position - param.srcObject.transform.position;
        //    if (dis.sqrMagnitude > LightingEffectFactory.CreateDistance * LightingEffectFactory.CreateDistance)
        //    {
        //        return null;
        //    }
        //}

        //处理单一实例的光效
        if (LightingEffectFactory.Instance.IsSingleEffect(nID))
        {
            foreach (LightingEffectBehavior effect in mEffectList)
            {
                if (effect.getID() == nID && effect.EffectConfig.bSingle)
                {
                    if (effect.EffectConfig.bRecoverSingleEffect)
                    {
                        effect.recoverEffectLift(param);
                        return(effect);
                    }
                    else if (effect.EffectParam.nTargetEntityID == param.nTargetEntityID)
                    {
                        effect.extendEffectLift();
                        return(effect);
                    }
                }
            }
        }

        if (LightingEffectFactory.Instance.CheckGolbalEffect(nID) && isGlobal == false)
        {
            LightingEffectManager leManager = EntityFactory.GloabaleManager;
            if (leManager != null && leManager.isGlobal == true)
            {
                leManager.AddLighting(nID, param);
            }
            return(null);
        }

        LightingEffectBehavior newEffect = LightingEffectFactory.Instance.CreateEffect(nID, param);

        if (newEffect == null)
        {
            return(null);
        }

        newEffect.showLog = showLog;
        //string needStateName = newEffect.getWaitState();

        //if (needStateName.Length != 0)
        //{
        //    AnimatorStateInfo sta = animator.GetCurrentAnimatorStateInfo(1);
        //    if (!sta.IsName(needStateName))
        //    {
        //        //等下一个切换状态时再检测
        //        mDelayEffectList.Add(newEffect);
        //        return newEffect;
        //    }
        //}

        //开始失败了,返回null
        if (newEffect.Begin())
        {
            mEffectList.Add(newEffect);

            return(newEffect);
        }
        return(null);
    }
コード例 #5
0
    private bool createEffect()
    {
        LightEffectParam newParam = new LightEffectParam();

        EffectParam.ColoneTo(ref newParam);

        float maxDistance = EffectParam.fDistance;
        float effectRad   = EffectParam.fAttackRange;

        Vector3 newSourcePos = newParam.srcObject.transform.position;

        if (sourceTransform != null)
        {
            newSourcePos = sourceTransform.position;
        }


        Vector3 areaTargetPos = EffectParam.targetPos;
        Vector3 newTargetPos  = areaTargetPos;

        //构造一个范围内的随机目标位置
        if (areaConfig.projectOnGround == true)
        {  //构造一个投影到地面的圆形
            int     angle  = Random.Range(0, 360);
            float   _rad   = angle * Mathf.PI / 180.0f;
            Vector3 offset = new Vector3(Mathf.Sin(_rad), 0, Mathf.Cos(_rad));
            float   dis    = Random.Range(0.0f, effectRad);
            offset       *= dis;
            newTargetPos += offset;

            RaycastHit _ClosestHitInfo_Down;
            RaycastHit _ClosestHitInfo_Up;
            float      rayDistance          = maxDistance;
            Ray        PointToGroundRayDown = new Ray(newTargetPos, new Vector3(0, -1, 0));
            Ray        PointToGroundRayUp   = new Ray(newTargetPos, new Vector3(0, 1, 0));
            bool       DownHit     = Physics.Raycast(PointToGroundRayDown, out _ClosestHitInfo_Down, rayDistance, -1);
            bool       UpHit       = Physics.Raycast(PointToGroundRayUp, out _ClosestHitInfo_Up, rayDistance, -1);
            Vector3    recordPos   = newTargetPos;
            float      hitDistance = maxDistance;
            if (DownHit)
            {
                hitDistance  = (_ClosestHitInfo_Down.point - recordPos).magnitude;
                newTargetPos = _ClosestHitInfo_Down.point;
            }

            if (UpHit)
            {
                if ((_ClosestHitInfo_Up.point - recordPos).magnitude < hitDistance)
                {
                    hitDistance  = (_ClosestHitInfo_Up.point - recordPos).magnitude;
                    newTargetPos = _ClosestHitInfo_Up.point;
                }
            }

            newParam.targetPos = newTargetPos;
        }
        else if (effectRad > 0.01f)
        { //构造一个圆锥
            Vector3 normal  = EffectParam.targetPos - newSourcePos;
            Vector3 tangent = new Vector3(0, 0, 1);
            Vector3.OrthoNormalize(ref normal, ref tangent);
            int        angle    = Random.Range(0, 360);
            Quaternion rotation = Quaternion.AngleAxis((float)angle, normal);
            tangent = rotation * tangent;
            float dis = Random.Range(0.0f, effectRad);
            tangent      *= dis;
            newTargetPos += tangent;
            if (areaConfig.extentToMaxDistance)
            {//将目标点拉远,延长用更容易造成与地面的碰撞
                Vector3 dir = newTargetPos - newSourcePos;
                dir.Normalize();
                newTargetPos = newSourcePos + dir * maxDistance;
            }
            newParam.targetPos = newTargetPos;
        }
        else
        {
            if (areaConfig.extentToMaxDistance)
            {//将目标点拉远,延长用更容易造成与地面的碰撞
                Vector3 dir = newTargetPos - newSourcePos;
                dir.Normalize();
                newTargetPos = newSourcePos + dir * maxDistance;
            }
            newParam.targetObject = EffectParam.targetObject;
            newParam.targetPos    = EffectParam.targetPos;
        }

        if (areaConfig.customOffset.sqrMagnitude > 0.001f)
        {
            //有此设置时,变更起始点,变为相对于newParam.targetPos,偏移customOffet
            Vector3 offsetNormal = EffectParam.targetPos - newSourcePos;
            offsetNormal.y = 0;
            offsetNormal.Normalize();
            Vector3 offsetTangent  = new Vector3(0, 1, 0);
            Vector3 offsetBinormal = Vector3.Cross(offsetTangent, offsetNormal);
            //Vector3.OrthoNormalize(ref offsetNormal, ref offsetTangent,ref offsetBinormal);
            Vector3 offSet = newParam.targetPos;
            offSet               += offsetNormal * areaConfig.customOffset.z;
            offSet               += offsetTangent * areaConfig.customOffset.y;
            offSet               += offsetBinormal * areaConfig.customOffset.x;
            newParam.sourcePos    = offSet;
            newParam.nEffectFlag |= (int)LightEffectParam.EFFECT_FLAG.CustomSourcePos;
        }

        LightingEffectManager leManager = EffectParam.srcObject.GetComponent <LightingEffectManager>();

        if (leManager != null)
        {
            ////测试用代码,用来标记检测发射区域是否正确
            //GameObject checkPoint = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            //checkPoint.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f);
            //checkPoint.transform.SetPosition( newParam.targetPos;
            //checkPoint.collider.enabled = false;
            //checkPoint.name = "Point" + mEffectLeftCount.ToString();

            leManager.AddLighting(areaConfig.subEffectID, newParam);
        }

        return(true);
    }
コード例 #6
0
        private void LoadPrizeResultEffectAndSetUIData()
        {
            //获取当前开启的宝箱配置
            prizeChestConfig = ActorPrizeConfig.Instance.GetPrizeChestConfig(m_nResultPageChestType);
            if (prizeChestConfig == null)
            {
                return;
            }

            //创建临时模型
            tempModelID = Mathf.Clamp(prizeChestConfig.nChestModelID - 1, 0, 2);
            if (prizeChestResNodeList[tempModelID] != null)
            {
                GameObject prizeChestObj = prizeChestResNodeList[tempModelID].InstanceMainRes();
                if (prizeChestObj != null)
                {
                    prizeChestObj.transform.SetParent(prizeResultObjContainer);
                    prizeChestObj.transform.localPosition = Vector3.zero;

                    tempPriezeChestModel = prizeChestObj;
                }
            }
            else
            {
                Debug.LogError(String.Format("not find model ID in prizeChestResNodeList[{0}]", tempModelID));
                return;
            }

            //播放模型打开动画的光效
            SceneEffectParamBase openEffectParam = new SceneEffectParamBase(prizeChestConfig.nOpenEffect, tempPriezeChestModel.transform);

            SceneEffectManager.Instance.CreateSceneEffect(ref openEffectParam);

            Data.UISoundConfig.SSchemeUSoundData soundData = new Data.UISoundConfig.SSchemeUSoundData();
            if (Data.UISoundConfig.UISoundConfig.Instance.GetData(SoundFilter_AnimStart, SoundKey_AnimStart, ref soundData))
            {
                SoundManager.CreateUISound(soundData.USoundID);
            }

            Transform[] tempChestModelChilds = tempPriezeChestModel.transform.GetComponentsInChildren <Transform>();

            //挂载摄像机动画
            Transform cmdTr = prizeResultObjContainer.parent.FindChild("CamTarget");

            if (cmdTr != null)
            {
                DestroyObject(cmdTr.gameObject);
            }
            GameObject camTarget = new GameObject();

            camTarget.name = "CamTarget";
            camTarget.transform.SetParent(prizeResultObjContainer.parent);
            camTarget.transform.localPosition    = prizeResultObjContainer.localPosition;
            camTarget.transform.localEulerAngles = Vector3.zero;

            LightingEffectManager lem = EntityFactory.EffectGroup.GetComponent <LightingEffectManager>();

            if (lem != null)
            {
                LightEffectParam param = new LightEffectParam();
                param.srcObject = camTarget;
                param.sourcePos = camTarget.transform.position;
                param.targetPos = camTarget.transform.position;

                m_camEffectID = prizeChestConfig.nCamEffectID;

                lem.AddLighting(prizeChestConfig.nCamEffectID, param);
            }


            List <int> prizeIdList = LogicDataCenter.prizeChestDataManager.PrizeIdList;

            openPrizeCount = 0;
            prizeCount     = Mathf.Clamp(prizeIdList.Count, 0, 7);

            //增加Tooltip
            if (continueOpenBtn != null)
            {
                continueOpenBtn.interactable = prizeCount > 0 ? false : true;
                if (!continueOpenBtn.interactable)
                {
                    UTooltipTrigger tooltip = continueOpenBtn.gameObject.GetComponent <UTooltipTrigger>();
                    if (tooltip == null)
                    {
                        tooltip = continueOpenBtn.gameObject.AddComponent <UTooltipTrigger>(ETooltipStyle.ETS_Default);
                    }
                    tooltip.SetText(UTooltipParamName.BodyText, openTips);
                }
            }

            foreach (PrizeResultItem item in prizeResultList)
            {
                UTooltipTrigger trigger = item.transform.GetComponent <UTooltipTrigger>();
                if (trigger != null)
                {
                    trigger.enabled = false;
                }
            }

            //奖励宝箱模型上挂载光效
            for (int i = 0; i < prizeIdList.Count; ++i)
            {
                //PrizeID必须大于0,界面大小,图标最多放12个
                if (prizeIdList[i] <= 0 || i >= 7)
                {
                    break;
                }

                int nPrizeID = prizeIdList[i];
                SSchemeActorPrizeConfig config = null;

                if (nPrizeID >= RAND_CARD_FIRST_INDEX && nPrizeID < LogicDataCenter.prizeChestDataManager.RandCardIndex)
                {
                    config = LogicDataCenter.prizeChestDataManager.RandCardResult[nPrizeID];
                }
                else
                {
                    config = ActorPrizeConfig.Instance.GetActorPrizeConfig(nPrizeID);
                }

                if (config == null)
                {
                    return;
                }

                //骨骼上挂载奖励光效
                foreach (Transform tr in tempChestModelChilds)
                {
                    if (tr != null && tr.name.Equals(bonesName[i]))
                    {
                        SceneEffectParamBase effectParam = new SceneEffectParamBase(config.nCakeTrailEffectID, tr, null, true, 2700);
                        SceneEffectManager.Instance.CreateSceneEffect(ref effectParam);

                        CakeTrailEffectParamList.Add(effectParam);
                    }
                }
                //奖励UI数据填充
                prizeResultList[i].SetData(this, i, prizeIdList[i], config);
            }
            //开启动画定时器
            TimerManager.SetTimer(this, chestAnimTimer, 4.2f);
        }