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); } }
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); } } } }
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); } }