293 lines
12 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|