Files
Main/Assets/Code/Logic/_Required/CameraControlUtil/CameraControlUtil.cs
2025-01-25 04:38:09 +08:00

293 lines
12 KiB
C#

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