public void FloatBlood(int hp, SplitBattleBillboardType type = SplitBattleBillboardType.CriticalPlayer)
 {
     if (GameCommonUtils.GetChild(transform, "slot_billboard"))
     {
         BillboardLogicManager.Instance.AddSplitBattleBillboard(GameCommonUtils.GetChild(transform, "slot_billboard").position, hp, type);
     }
 }
Beispiel #2
0
        IEnumerator OnLoadAsset <T>(string abName) where T : UObject
        {
            AssetBundleInfo bundleInfo = GetLoadedAssetBundle(abName);

            if (bundleInfo == null)
            {
                yield return(StartCoroutine(OnLoadAssetBundle(abName, typeof(T))));

                bundleInfo = GetLoadedAssetBundle(abName);
                if (bundleInfo == null)
                {
                    m_LoadRequests.Remove(abName);
                    Debug.LogError("OnLoadAsset--->>>" + abName);
                    yield break;
                }
            }
            List <LoadAssetRequest> list = null;

            if (!m_LoadRequests.TryGetValue(abName, out list))
            {
                m_LoadRequests.Remove(abName);
                yield break;
            }
            for (int i = 0; i < list.Count; i++)
            {
                string[]       assetNames = list[i].assetNames;
                List <UObject> result     = new List <UObject>();

                AssetBundle ab = bundleInfo.m_AssetBundle;
                for (int j = 0; j < assetNames.Length; j++)
                {
                    string             assetPath = assetNames[j];
                    AssetBundleRequest request   = ab.LoadAssetAsync(assetPath, list[i].assetType);
                    yield return(request);

                    result.Add(request.asset);
                    ///重置资源的shader
                    GameCommonUtils.ResetShader(request.asset);
                    //T assetObj = ab.LoadAsset<T>(assetPath);
                    //result.Add(assetObj);
                }
                if (list[i].sharpFunc != null)
                {
                    list[i].sharpFunc(result.ToArray());
                    list[i].sharpFunc = null;
                }
                if (list[i].luaFunc != null)
                {
                    list[i].luaFunc.Call((object)result.ToArray());
                    list[i].luaFunc.Dispose();
                    list[i].luaFunc = null;
                }
                bundleInfo.m_ReferencedCount++;
            }
            m_LoadRequests.Remove(abName);
        }
    private void AddEquidMethod2(EquipData equipData)
    {
        if (!m_equipGoDic.ContainsKey(equipData.id))
        {
            return;
        }
        Material material = m_equipGoDic[equipData.id].mat;

        //GameObject instance = m_equipGoDic[equipData.id].goList[0];
        if (transform == null)
        {
            return;
        }
        Transform equipPart = GameCommonUtils.GetChild(transform, equipData.slot[0]);

        if (equipPart == null)
        {
            return;
        }

        SkinnedMeshRenderer smr = equipPart.GetComponent <SkinnedMeshRenderer>();

        if (!smr)//安全检查
        {
            return;
        }
        m_smrList.Add(smr);
        m_equipMeshOrMaterialList.Add(material);
        smr.sharedMaterial = material;
        smr.castShadows    = false;
        smr.receiveShadows = false;
        smr.useLightProbes = true;
        SkinnedMeshRenderer smrTemp = m_equipGoDic[equipData.id].smr;

        //if (equipData.type.Count > 1) ClearOriginalModel();

        smr.sharedMesh = smrTemp.sharedMesh;
        //CombineInstance ci = new CombineInstance();
        //ci.mesh = smrTemp.sharedMesh;
        //m_combineInstances.Add(ci);

        List <Transform> bones = new List <Transform>();

        for (int i = 0; i < smrTemp.bones.Length; i++)
        {
            bones.Add(GameCommonUtils.GetChild(this.transform, smrTemp.bones[i].name));
        }
        //m_bones.AddRange(bones);
        smr.bones = bones.ToArray();
        //m_equipMeshOrMaterialList.Add(instance);
    }
    protected override void OnCreateModel()
    {
        data = AvatarModelData.GetByID(1);
        if (data == null)
        {
            Debuger.LogError("数据Error null" + serverInfo.dataId);
            return;
        }
        gameObject = Res.ResourceManager.Instance.Instantiate <GameObject>(GameCommonUtils.GetResourceData(data.prefabName).resourcePath);

        transform     = gameObject.transform;
        transform.tag = "Player";
        transform.gameObject.layer = 11;

        ActorMyself ap = gameObject.AddComponent <ActorMyself>();

        this.Motor           = gameObject.AddComponent <MotorMyself>();
        this.Motor.theEntity = this;
        ap.theEntity         = this;
        animator             = gameObject.GetComponent <Animator>();
        this.Actor           = ap;
        UpdatePosition();

        animator.applyRootMotion = false;


        gameObject.AddComponent <DontDestroyMe>();
        //ap.InitEquipment();
        ap.Equip(104001);
        ap.Equip(104002);

        if (data.scale > 0)
        {
            ap.transform.localScale = Vector3.one * data.scale;
        }

        GameObject light = Res.ResourceManager.Instance.Instantiate <GameObject>("Gear/RoundLight");

        light.transform.parent        = gameObject.transform;
        light.transform.localPosition = new Vector3(0, 1, 0);

        character = ap.GetComponent <CharacterController>();
    }
    public virtual void UpdatePosition()
    {
        Vector3 point;

        if (transform)
        {
            if (GameCommonUtils.GetPointInTerrain(bornPosition.x, bornPosition.z, out point))
            {
                transform.position = new Vector3(point.x, point.y + 0.3f, point.z);
                if (rotation != Vector3.zero)
                {
                    transform.eulerAngles = new Vector3(0, rotation.y, 0);
                }
            }
            else
            {
                var map    = GameStateManager.CurrentSceneData;
                var myself = this as EntityMyself;
                if (myself != null)
                {
                    Vector3 bornPoint;
                    if (GameCommonUtils.GetPointInTerrain((float)(map.enterPoint.x), (float)(map.enterPoint.z), out bornPoint))
                    {
                        transform.position = new Vector3(bornPoint.x, bornPoint.y + 0.5f, bornPoint.z);
                    }
                    else
                    {
                        transform.position = new Vector3(bornPoint.x, bornPoint.y, bornPoint.z);
                    }
                }
                else
                {
                    transform.position = new Vector3(point.x, point.y + 1, point.z);
                }
            }
        }
    }
Beispiel #6
0
    protected override void OnCreateModel()
    {
        data = MonsterData.GetByID(serverInfo.dataId);
        if (data == null)
        {
            Debuger.LogError("怪物数据Error null" + serverInfo.dataId);
            return;
        }
        AvatarModelData modelData = AvatarModelData.GetByID(data.modelId);

        gameObject = Res.ResourceManager.Instance.Instantiate <GameObject>(GameCommonUtils.GetResourceData(modelData.prefabName).resourcePath);

        transform     = gameObject.transform;
        transform.tag = "Monster";
        transform.gameObject.layer = 11;

        ActorMonster ap = gameObject.AddComponent <ActorMonster>();

        ap.theEntity = this;
        animator     = gameObject.GetComponent <Animator>();
        this.Actor   = ap;

        this.Motor           = gameObject.AddComponent <MotorParent>();
        this.Motor.theEntity = this;
        UpdatePosition();
        if (modelData != null && modelData.scale > 0)
        {
            gameObject.transform.localScale = new Vector3(modelData.scale, modelData.scale, modelData.scale);
            if (modelData.scaleRadius > 0 && ap.GetComponent <CharacterController>() != null)
            {
                ap.GetComponent <CharacterController>().radius = modelData.scaleRadius;
            }
        }

        animator.applyRootMotion = false;
    }
    private List <uint> GetHitEntities(int hitActionID, Matrix4x4 ltwm, Quaternion rotation, Vector3 forward, Vector3 position)
    {
        var spellData = SkillAction.dataMap[hitActionID];

        // 目标类型 0 敌人, 1 自己  2 队友  3  友方
        int targetType = spellData.targetType;
        // 攻击范围类型。  0  扇形范围 1  圆形范围, 2, 单体。 3  直线范围 4 前方范围
        int targetRangeType = spellData.targetRangeType;
        // 攻击范围参数。 针对不同类型,有不同意义。 浮点数列表
        List <float> targetRangeParam = spellData.targetRangeParam;
        float        offsetX          = spellData.hitXoffset;
        float        offsetY          = spellData.hitYoffset;
        float        angleOffset      = 180;
        // 最大攻击人数
        //int maxTargetCount = spellData.maxTargetCount;
        // 触发伤害特效帧数
        //int damageTriggerFrame = spellData.damageTriggerFrame;

        List <uint> entities = new List <uint>();

        if (targetType == (int)TargetSelectType.Myself)
        {
            entities.Add(owner.ID);
            return(entities);
        }
        if (owner.transform == null)
        {
            return(entities);
        }
        Matrix4x4  entityltwm     = owner.transform.localToWorldMatrix;
        Quaternion entityrotation = owner.transform.rotation;
        Vector3    entityforward  = owner.transform.forward;
        Vector3    entityposition = owner.transform.position;

        if (spellData.castPosType == 0)
        {
            entityltwm     = ltwm;
            entityrotation = rotation;
            entityforward  = forward;
            entityposition = position;
        }
        TargetRangeType rangeType = (TargetRangeType)targetRangeType;

        switch (rangeType)
        {
        case TargetRangeType.CircleRange:
            if (targetRangeParam.Count >= 1)
            {
                float radius = targetRangeParam[0] * 0.01f;

                entities = GameCommonUtils.GetEntitiesInRange(entityltwm, entityrotation, entityforward, entityposition, radius, offsetX, offsetY, angleOffset);
            }
            break;

        case TargetRangeType.SectorRange:
            if (targetRangeParam.Count >= 2)
            {
                float radius = targetRangeParam[0] * 0.01f;
                float angle  = targetRangeParam[1];
                entities = GameCommonUtils.GetEntitiesInSector(entityltwm, entityrotation, entityforward, entityposition, radius, angle, offsetX, offsetY, angleOffset);
                //entities = Utils.GetEntities(theOwner.Transform, radius, angle);
            }
            break;

        case TargetRangeType.SingeTarget:
            if (targetRangeParam.Count >= 1)
            {
                float radius = targetRangeParam[0] * 0.01f;
                float angle  = 150;
                entities = GameCommonUtils.GetEntitiesInSector(entityltwm, entityrotation, entityforward, entityposition, radius, angle, offsetX, offsetY, angleOffset);
                GameCommonUtils.SortByDistance(owner.transform, entities);
                if (entities.Count > 1)
                {
                    for (int i = 1; i < entities.Count; i++)
                    {
                        entities.RemoveAt(i);
                    }
                }
            }
            break;

        case TargetRangeType.WorldRange:
            if (targetRangeParam.Count >= 4)
            {
                float x1      = targetRangeParam[0] * 0.01f;
                float y1      = targetRangeParam[1] * 0.01f;
                float x2      = targetRangeParam[2] * 0.01f;
                float y2      = targetRangeParam[3] * 0.01f;
                float minX    = Math.Min(x1, x2);
                float maxX    = Math.Max(x1, x2);
                float minY    = Math.Min(y1, y2);
                float maxY    = Math.Max(y1, y2);
                float radiusX = minX + (maxX - minX) * 0.5f;
                float radiusY = minY + (maxY - minY) * 0.5f;
                float radius  = Vector2.Distance(new Vector2(x1, y1), new Vector2(x2, y2)) * 0.5f;
                entities = GameCommonUtils.GetEntitiesInRange(new Vector3(radiusX, 0, radiusY), radius);
            }
            break;

        case TargetRangeType.LineRange:
        default:
            if (targetRangeParam.Count >= 2)
            {
                float length = targetRangeParam[0] * 0.01f;
                float width  = targetRangeParam[1] * 0.01f;
                entities = GameCommonUtils.GetEntitiesFrontLineNew(entityltwm, entityrotation, entityforward, entityposition, length, entityforward, width, offsetX, offsetY, angleOffset);
            }
            break;
        }
        return(entities);
    }
    private void PlayFX(int id, EffectData fx, System.Action <GameObject, string> action = null, string bone_path = "")
    {
        //HandleWeaponTrial(fx);
        HandleAnim(fx);
        HandleFade(fx);



        string     path = GameCommonUtils.GetResourceData(fx.resourceName).resourcePath;
        GameObject obj  = Res.ResourceManager.Instance.Instantiate <GameObject>(path);
        string     guid = path;

        m_loadedFX.Add(path);

        var go = obj as GameObject;

        if (!m_fxDic.ContainsKey(id))
        {
            m_fxDic[id] = new Dictionary <string, GameObject>();
        }
        if (!m_fxDic[id].ContainsKey(guid))
        {
            m_fxDic[id].Add(guid, go);
        }
        else
        {
            m_fxDic[id][guid] = go;
        }

        //处理音效
        var audio = go.GetComponent <AudioSource>();

        if (audio != null)
        {
            audio.volume = 1f;

            FrameTimerHeap.AddTimer((uint)fx.soundDelay, 0, () =>
            {
                if (audio != null)
                {
                    audio.enabled = true;
                }
            });
        }
        switch ((FXLocationType)fx.locationType)
        {
        case FXLocationType.SelfSlot:

            // 判断输入路径是否指定,若未指定则绑在预设的骨上
            if (bone_path == "")
            {
                if (!m_locationDic.ContainsKey(fx.slot))
                {
                    m_locationDic.Add(fx.slot, GetBone(transform, fx.slot));
                }
                go.transform.parent = m_locationDic[fx.slot];
            }

            // 若已经指定则绑在指定的骨上
            else
            {
                if (!m_locationDic.ContainsKey(bone_path))
                {
                    m_locationDic.Add(bone_path, GetBone(transform, bone_path));
                }
                go.transform.parent = m_locationDic[bone_path];

                // 记下index,以便删除
                slotCueHandler.SetFxList(id, bone_path, guid);
            }

            go.transform.localPosition = go.transform.position;
            go.transform.localRotation = go.transform.rotation;
            break;

        case FXLocationType.World:
            go.transform.position = fx.location;
            break;

        case FXLocationType.SelfLocal:
            go.transform.parent = transform;
            //LoggerHelper.Debug(go.transform.position.x + " " + go.transform.position.y + " " + go.transform.position.z);
            go.transform.localPosition = go.transform.position;
            go.transform.localRotation = go.transform.rotation;
            go.transform.forward       = transform.forward;
            break;

        case FXLocationType.SelfWorld:
            go.transform.localPosition = transform.localPosition;
            go.transform.localRotation = go.transform.rotation;
            go.transform.position      = transform.position;
            go.transform.forward       = transform.forward;
            break;

        case FXLocationType.SlotWorld:

            if (!m_locationDic.ContainsKey(fx.slot))
            {
                m_locationDic.Add(fx.slot, GetBone(transform, fx.slot));
            }

            var solt = m_locationDic[fx.slot];
            go.transform.localPosition = solt.transform.localPosition;
            go.transform.position      = solt.transform.position;
            go.transform.localRotation = solt.transform.rotation;
            break;

        default:
            break;
        }
        if (fx.isStatic == (int)FXStatic.NotStatic)
        {
            Action actRemove = () =>
            {
                if (this)
                {
                    RemoveFX(id, guid);
                }
            };
            if (fx.duration > 0)
            {
                FrameTimerHeap.AddTimer((uint)(fx.duration * 1000), 0, actRemove);
            }
            else
            {
                FrameTimerHeap.AddTimer(3000, 0, actRemove);
            }
        }
        else
        {
            //如果技能为静态技能,分组标记非0,而且特效绑定到自身
        }
        if (action != null)
        {
            action(go, guid);
        }
    }