IEnumerator CheckOcclus() { while (true) { yield return(checkOccInterval); Vector3 pos = Vector3.zero; if (null != Initialize.mainCam) { pos = Initialize.mainCam.transform.position; } occlusCamera = false; if (SkinControl && SkinConfig && EntityFactory.MainHeroView != null && EntityFactory.MainHero) { CheckRay.origin = pos; Vector3 mainPlayPos = EntityFactory.MainHero.transform.position; mainPlayPos.y += EntityFactory.MainHeroView.Property.CreatureHeightInMeters; Vector3 dir = mainPlayPos - pos; PlayerCameraDistance = Vector3.Distance(mainPlayPos, pos); CheckRay.direction = dir.normalized; RaycastHit hitInfo; if (SkinConfig.OcclusCollider.Raycast(CheckRay, out hitInfo, PlayerCameraDistance)) { occlusCamera = true; if (lastocclusCamera != occlusCamera) { lastocclusCamera = occlusCamera; SkinControl.setAlpha(occlusCameraAlpha); } } else { if (lastocclusCamera != occlusCamera) { lastocclusCamera = occlusCamera; SkinControl.setAlpha(1.0f); } } } } }
/// <summary> /// 实体优化 /// </summary> private void EntityOptimize() { if (!SkinConfig || SoldierCamera.MainInstance() == null || Initialize.mainCam == null || Initialize.Instance.SoliderTargetGO == null) { return; } float dragonOptimitzedDistance = 7.0f; //策划控制 U3D_Render.EntityView mainEv = EntityFactory.getMainPlayer(); if (null == mainEv) { return; } //大小龙体积过大,透明度优化 int vocationID = creaturePropety.GetNumProp(ENTITY_PROPERTY.PROPERTY_VOCATION); if (vocationID > 11 && vocationID < 15) { //检测距离,如果距离太近,不降低透明度 float dis = CaclDistance(mainEv.gameObject.transform.position, creature.position); if (dragonOptimitzedDistance > dis) { SkinControl.setAlpha(0.5f); } else { SkinControl.setAlpha(1.0f); } } if (SkinConfig.OptimitzedDistance > 0) { //检测距离,如果距离太远,不渲染了 //参考点分两种情况:上帝模式、非上帝模式 Vector3 calcPos = new Vector3(); if (SoldierCamera.MainInstance().cameraMode == CameraMode.MapGodControl || SoldierCamera.MainInstance().cameraMode == CameraMode.OBMoveFree) { calcPos = Initialize.mainCam.transform.position; } else { calcPos = Initialize.Instance.SoliderTargetGO.transform.position; } #if ENABLE_YUNYING_MODE if (SoldierCamera.MainInstance().cameraMode == CameraMode.YUNYING_OBMoveFree) { calcPos = Initialize.mainCam.transform.position; } return; #endif calcPos.y = creature.position.y; float dis = CaclDistance(calcPos, creature.position); if (dis < SkinConfig.OptimitzedDistance) { if (!m_DistanceVisible) { m_DistanceVisible = true; //淡入的时候是不可见的,所以要立马更新可见性 UpdateVisible(); //淡入皮肤 FadeInSkin(); } //位置往前移2m,再判断 Vector3 p = creature.position + Initialize.mainCam.transform.forward * 2.0f; bool isOnFrustmView = CameraUtil.isOnCameraView(p); if (isOnFrustmView) { GameUtil.EnabledAnimator(animator); } else { GameUtil.DisabledAnimator(animator); } } else { if (m_DistanceVisible) { m_DistanceVisible = false; //淡出皮肤 FadeOutSkin(); } GameUtil.DisabledAnimator(animator); } UpdateFadeSkin(); } //如果没有开启优化,走老套路 else { if (!m_DistanceVisible) { m_DistanceVisible = true; UpdateVisible(); SkinControl.setAlpha(1.0f); GameUtil.EnabledAnimator(animator); } } }