using Thousandto.Cfg.Data; using Thousandto.Code.Center; using Thousandto.Core.Asset; using Thousandto.Core.PostEffect; using Thousandto.Plugins.Common.UniScene; using System.Collections.Generic; using UnityEngine; namespace Thousandto.Code.Logic { //摄像机控制接口, public class CameraControlUtil { //载入地图配置的摄像机控制参数 public void LoadCameraSetting(DeclareMapsetting mapSetting, CameraControl control) { if (control == null) return; if (mapSetting == null) return; #if USE_PC_MODEL int curFov = mapSetting.CameraFovPc; #else int curFov = mapSetting.CameraFov; #endif CameraControlDefine.SetCameraParms(mapSetting.CamDefaultYaw, mapSetting.CamMinYaw, mapSetting.CamMaxYaw, mapSetting.CamDefaultDis / 100f, mapSetting.CamFarDis / 100f, mapSetting.CamDefaultPitch, mapSetting.CamFarPitch, mapSetting.CamDefaultOffsety / 100f, mapSetting.CamFarOffsety / 100f, curFov); } //设置摄像机跟随主角 public void FollowToLocalPlayer() { FollowToCharacter(GameCenter.GameSceneSystem.GetLocalPlayer(), false); } //设置摄像机跟随某角色 public void FollowToCharacter(Character target, bool playAnim) { if (target == null) return; if (GameCenter.GameSceneSystem.ActivedScene == null) return; var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl; if (control == null) return; var targetTrans = target.ModelTransform; float offsetY = CameraControlDefine.LockOffsetY; float targetDis = control.CurDis; if(targetDis > CameraControlDefine.MaxDis) { targetDis = CameraControlDefine.MaxDis; } if (targetDis < CameraControlDefine.CurMinDis) { targetDis = CameraControlDefine.CurMinDis; } CameraControlDefine.DisAddValue = 0f; CameraControlDefine.PitchAddValue = 0f; if (target.Skin != null && target.Skin.SkinPartIsValid(FSkinPartCode.Mount)) { var cfg = DeclareHuaxingHorse.Get(target.Skin.GetSkinPartCfgID(FSkinPartCode.Mount)); if (cfg != null) { offsetY = cfg.SceneCameraYAdd / 100f; CameraControlDefine.DisAddValue = cfg.SceneCameraDisadd / 100f; targetDis += CameraControlDefine.DisAddValue; CameraControlDefine.PitchAddValue = cfg.SceneCameraPitchadd; } } var halfMaxDis = (CameraControlDefine.CurMaxDis - CameraControlDefine.CurMinDis) / 2f; if (targetDis < halfMaxDis) { playAnim = false; } if (control.TargetTrans != targetTrans) { control.SetTarget(targetTrans); control.CurOffsetY = offsetY; } else { if(playAnim) { control.PlayAnim(CameraControlDefine.LockPitch, control.CurYaw, targetDis, control.CurOffsetX, offsetY, CameraControlDefine.CurFov, 0.3f); } else { control.CurDis = targetDis; control.CurOffsetY = offsetY; } } PostEffectManager.Instance.SetShadowTargetTransform(target.ModelTransform); } //切换摄像机的锁定状态 public void ChangeCamearLockState(bool isLock) { if (GameCenter.GameSceneSystem.ActivedScene == null) return; var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl; if (control == null) return; control.ChangeLockState(isLock); } //获取摄像机的锁定状态 public bool GetCamearLockState() { if (GameCenter.GameSceneSystem.ActivedScene == null) return false; var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl; if (control == null) return false; return control.IsLock; } //设置摄像机特写目标 public bool SetFetrueCharacter(Character target, float offsetX = 0f, float aniTime = 1f) { if (GameCenter.GameSceneSystem.ActivedScene == null) return false; var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl; if (control == null) return false; var dir = target.GetFacingDirection(); dir.y = 0; dir = -dir.normalized; // [0, PI] var yaw = Mathf.Acos(Vector3.Dot(dir, Vector3.forward)); if (dir.x < 0) { yaw = -yaw; //[-PI, 0] } yaw = yaw / Mathf.PI * 180f; control.PlayAnim(0f, yaw + 20f, 2f, offsetX, 1f, CameraControlDefine.CurFov, aniTime); return true; } //执行场景编辑器中的改变摄像机事件 public bool DoTriggerChangeCamera(List<string> changeParams) { //if (changeParams.Count <= 0) // return false; //if (GameCenter.GameSceneSystem.ActivedScene == null) // return false; //var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl; //if (control == null) // return false; //float yaw = control.CurYaw; //float pitch = control.CurPitch; //float dis = control.CurDis; //float yawMin = CameraControlDefine.MinYaw; //float yawMax = CameraControlDefine.MaxYaw; //float pitchMin = CameraControlDefine.MinPitch; //float pitchMax = CameraControlDefine.MaxPitch; //float disMin = CameraControlDefine.MinDis; //float disMax = CameraControlDefine.MaxDis; //bool playAnim = true; //bool is2d = false; //bool doLimitYaw = false; //bool doLimit = false; //for (int i = 0; i < changeParams.Count; ++i) //{ // if (changeParams[i] == "2d") // { // is2d = true; // } // else if (changeParams[i] == "3d") // { // is2d = false; // } // else // { // if (control.IsLock != is2d) // continue; // var commandParams = changeParams[i].Split('_'); // if (commandParams != null && commandParams.Length <= 0) // continue; // switch (commandParams[0]) // { // case "y": // if (commandParams.Length >= 2) // { // float value = 0f; // if (float.TryParse(commandParams[1], out value)) // { // yaw = value; // } // } // break; // case "p": // if (commandParams.Length >= 2) // { // float value = 0f; // if (float.TryParse(commandParams[1], out value)) // { // pitch = value; // } // } // break; // case "d": // if (commandParams.Length >= 2) // { // float value = 0f; // if (float.TryParse(commandParams[1], out value)) // { // dis = value; // } // } // break; // case "ly": // if(commandParams.Length >= 3) // { // float value1 = 0f; // float value2 = 0f; // if(float.TryParse(commandParams[1], out value1) && float.TryParse(commandParams[2], out value2)) // { // doLimitYaw = true; // doLimit = true; // yawMin = value1; // yawMax = value2; // } // } // break; // case "lp": // if (commandParams.Length >= 3) // { // float value1 = 0f; // float value2 = 0f; // if (float.TryParse(commandParams[1], out value1) && float.TryParse(commandParams[2], out value2)) // { // doLimit = true; // pitchMin = value1; // pitchMax = value2; // } // } // break; // case "ld": // if (commandParams.Length >= 3) // { // float value1 = 0f; // float value2 = 0f; // if (float.TryParse(commandParams[1], out value1) && float.TryParse(commandParams[2], out value2)) // { // doLimit = true; // disMin = value1; // disMax = value2; // } // } // break; // } // } //} //if(playAnim) //{ // control.PlayAnim(pitch, yaw, dis, control.CurOffsetX, control.CurOffsetY, 0.5f); //} //if(doLimit) //{ // CameraControlDefine.MinYaw = yawMin; // CameraControlDefine.MaxYaw = yawMax; // CameraControlDefine.MinPitch = pitchMin; // CameraControlDefine.MaxPitch = pitchMax; // CameraControlDefine.MinDis = disMin; // CameraControlDefine.MaxDis = disMax; // if(doLimitYaw) // { // CameraControlDefine.IsLimitYaw = true; // } //} return true; } //设置摄像机特写高度 public void SetCameraFeatureHeight(float height) { if (GameCenter.GameSceneSystem.ActivedScene == null) return; var control = GameCenter.GameSceneSystem.ActivedScene.SceneCameraControl; if (control == null) return; control.FeatureHeight = height; } } }