Esempio n. 1
0
 static void AddEffectCache(EffectCacheComponent effectCacheComponent, BaseBuffData buff, GameObject skillAssetsPrefabGo)
 {
     if (buff.GetBuffIdType() == BuffIdType.EmitObj)
     {
         Buff_EmitObj buff_EmitEffect = (Buff_EmitObj)buff;
         if (!string.IsNullOrEmpty(buff_EmitEffect.emitObjId) && !effectCacheComponent.Contains(buff_EmitEffect.emitObjId))
         {
             effectCacheComponent.Add(buff_EmitEffect.emitObjId, skillAssetsPrefabGo.Get <GameObject>(buff_EmitEffect.emitObjId));
         }
     }
     if (buff.GetBuffIdType() == BuffIdType.HitEffect)
     {
         Buff_HitEffect buff_HitEffect = (Buff_HitEffect)buff;
         if (!string.IsNullOrEmpty(buff_HitEffect.hitObjId) && !effectCacheComponent.Contains(buff_HitEffect.hitObjId))
         {
             effectCacheComponent.Add(buff_HitEffect.hitObjId, skillAssetsPrefabGo.Get <GameObject>(buff_HitEffect.hitObjId));
         }
     }
     if (buff.GetBuffIdType() == BuffIdType.PlayEffect)
     {
         Buff_PlayEffect buff_PlayEffect = (Buff_PlayEffect)buff;
         if (!string.IsNullOrEmpty(buff_PlayEffect.effectObjId) && !effectCacheComponent.Contains(buff_PlayEffect.effectObjId))
         {
             effectCacheComponent.Add(buff_PlayEffect.effectObjId, skillAssetsPrefabGo.Get <GameObject>(buff_PlayEffect.effectObjId));
         }
     }
 }
Esempio n. 2
0
    public void ActionHandle(BuffHandlerVar buffHandlerVar)
    {
        Buff_EmitObj buff        = buffHandlerVar.data as Buff_EmitObj;
        UnitData     emitObjData = new UnitData();

        if (!buff.FindFriend)
        {
            emitObjData.groupIndex = buffHandlerVar.source.UnitData.groupIndex;
        }
        else
        {
            switch (buffHandlerVar.source.UnitData.groupIndex)
            {
            case GroupIndex.Default:
                emitObjData.groupIndex = GroupIndex.Default;
                break;

            case GroupIndex.Player:
                emitObjData.groupIndex = GroupIndex.Monster;
                break;

            case GroupIndex.Monster:
                emitObjData.groupIndex = GroupIndex.Player;
                break;
            }
        }
        Log.Debug(string.Format("EmitObj {0}  Source  {1}", emitObjData.groupIndex, buffHandlerVar.source.UnitData.groupIndex));
        emitObjData.unitLayer = buff.layer;
        emitObjData.layerMask = buff.layerMask;
        emitObjData.unitTag   = UnitTag.Default;
        int index = 10000;

        if (buff.lockTarget)
        {
            if (!buffHandlerVar.GetBufferValue(out BufferValue_TargetUnits targetUnits))
            {
                return;
            }

            //每个单位都发射一个特效
            foreach (var v in targetUnits.targets)
            {
                long id = buffHandlerVar.source.Id + index; // 确保客户端/服务器发射的子弹的id都是一样的.
                index++;
#if !SERVER
                //特效
                UnityEngine.GameObject go = null;
                go = Game.Scene.GetComponent <EffectCacheComponent>().Get(buff.emitObjId);//先找到缓存的特效物体
                var effectGo = go;

                Unit unit = UnitFactory.CreateEmitObj(id, go, emitObjData);
                go.SetActive(true);
#else
                Unit unit = ETHotfix.UnitFactory.CreateEmitObj(id, emitObjData, buff.emitObjId);
#endif
                Vector3 dir            = (v.Position - buffHandlerVar.source.Position).normalized;
                Vector3 startPosOffset = buff.startPosOffset.ToV3();

                unit.Position = buffHandlerVar.source.Position + new Vector3(dir.x * startPosOffset.x, startPosOffset.y, dir.z * startPosOffset.z);
                Quaternion quaternion = Quaternion.LookRotation(dir, Vector3.up);
                unit.Rotation = quaternion;
                CollisionEvent_LockTarget(buffHandlerVar, unit, v, buff.emitSpeed).Coroutine();
            }
        }
        else
        {
            if (!buffHandlerVar.GetBufferValue(out BufferValue_Dir buffer_dir))
            {
                return;
            }
            long id = buffHandlerVar.source.Id + index; // 确保客户端/服务器发射的子弹的id都是一样的.
#if !SERVER
            UnityEngine.GameObject go = null;
            go = Game.Scene.GetComponent <EffectCacheComponent>().Get(buff.emitObjId);//先找到缓存的特效物体
            var  effectGo = go;
            Unit unit     = UnitFactory.CreateEmitObj(id, go, emitObjData);
            go.SetActive(true);
#else
            Unit unit = ETHotfix.UnitFactory.CreateEmitObj(id, emitObjData, buff.emitObjId);
#endif
            Vector3 startPosOffset = buff.startPosOffset.ToV3();
            Vector3 dir            = buffer_dir.dir.normalized;

            unit.Position = buffHandlerVar.source.Position + new Vector3(dir.x * startPosOffset.x, startPosOffset.y, dir.z * startPosOffset.z);
            //Log.Debug(string.Format("{0}使用者位置 方向{1} 初始位置偏移量{2},计算出的最终位置{3}", buffHandlerVar.source.Position, dir, startPosOffset, unit.Position));
            Log.Debug(string.Format("飞行物体的高度{0}", unit.Position.y));


            Quaternion quaternion = Quaternion.LookRotation(buffer_dir.dir, Vector3.up);
            unit.Rotation = quaternion;
            buffHandlerVar.source.Rotation = quaternion;
            Vector3 targetPos = dir * buff.emitSpeed * buff.duration + unit.Position;
            CollisionEvent(buffHandlerVar, unit, targetPos, buff.emitSpeed).Coroutine();
        }
    }