Files
JJBB/Assets/Project/Script/Obj/Obj_Characters/Obj_WeddingCar.cs
2024-08-23 15:49:34 +08:00

381 lines
12 KiB
C#

using Games.Events;
using Games.GlobeDefine;
using Games.LogicObj;
using Games.Scene;
using GCGame;
using GCGame.Table;
using Module.Log;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Games.LogicObj
{
public struct WCBingObjInfo
{
public ulong _Guid;
public Transform _BindParent;
public int _AnimationId;
public float _ScaleVal;
public WCBingObjInfo(ulong guid, Transform bindParent, int animationId, float scalVal)
{
_Guid = guid;
_BindParent = bindParent;
_AnimationId = animationId;
_ScaleVal = scalVal;
}
}
public class Obj_Init_WeddingCar : Obj_Character_Init_Data
{
public int _SceneId;
public int _SceneInsId;
public ulong _OwnerAId;
public ulong _OwnerBId;
public int _RoleBaseAttrId;
public Obj_Init_WeddingCar()
{
CleanUp();
}
public override void CleanUp()
{
base.CleanUp();
_SceneId = -1;
_SceneInsId = -1;
_OwnerAId = 0;
_OwnerBId = 0;
_RoleBaseAttrId = -1;
}
}
}
public class Obj_WeddingCar : Obj_Character
{
private Obj_Init_WeddingCar initData = null;
private const string _BindPointPathA = "PointA";
private const string _BindPointPathB = "PointB";
private const int _AnimationIdA = 37;
private const int _AnimationIdB = 38;
private NexusMover _mover;
private bool _init;
public override UIPathData HeadUiPath
{
get { return Obj_GuildGharryHeadUI.pathData; }
}
private float _CurScaleVal = 1.0f;
public override bool Init(ObjParent_Init_Data initData1)
{
speedAdaption = true;
var result = base.Init(initData1);
if (!result)
return false;
initData = initData1 as Obj_Init_WeddingCar;
var roleBaseAttr = TableManager.GetRoleBaseAttrByID(initData._RoleBaseAttrId, 0);
if (roleBaseAttr == null)
{
Debug.LogError("RoleBaseAttr is null : " + initData._RoleBaseAttrId);
return false;
}
var charModel = TableManager.GetCharModelByID(roleBaseAttr.CharModelID, 0);
if (null != charModel)
{
BaseAttr.HeadPic = charModel.HeadPic;
m_DeltaHeight = charModel.HeadInfoHeight * ModelScale;
}
m_ObjTransform.localRotation = Utils.DirServerToClient(initData.m_fDir);
_CurScaleVal = charModel.Scale;
m_ObjTransform.localScale = charModel.Scale * Vector3.one;
BaseAttr.MoveSpeed = initData.m_MoveSpeed;
InitNavAgent();
CreateNameBoard();
ObjManager.Instance.AddPoolObj(this);
CreateModel(roleBaseAttr.CharModelID);
_mover = new NexusMover(roleBaseAttr.Id, this);
return true;
}
public override void DestroyObj()
{
//SceneLogic.CameraController.OnWCMovie(false);
if (SceneLogic.CameraController != null)
SceneLogic.CameraController.ResetCameraToMainPlayer();
if (_mover != null)
{
_mover.DestroyMover();
_mover = null;
}
base.DestroyObj();
}
public void SetMoveSpeed()
{
if (NavAgent == null)
{
LogModule.ErrorLog("NavAgent is null");
return;
}
NavAgent.speed = initData.m_MoveSpeed;
}
public override void InitNameBoard(Obj_HeadUI headUiItem)
{
base.InitNameBoard(headUiItem);
HeadUi.Init(this);
HeadUi.SetName(initData.m_StrName);
HeadUi.SetOwnerName(initData.m_OwerName);
}
protected override void Update()
{
base.Update();
if (_mover != null && MovementState == MoveState.Move)
{
// 初始化Mover - 需要至少有一个移动目标,才可能正确获得预判位置来生成前导角色
if (!_init)
{
_init = true;
if (!_mover.CreateMover())
_mover = null;
}
else
_mover.SyncMovers();
}
}
protected override void CreateModelOver(Hashtable hashParam)
{
base.CreateModelOver(hashParam);
StartCoroutine(SetPlayer());
}
private Obj_OtherPlayer _PlayerA;
private Obj_OtherPlayer _PlayerB;
private Transform parentA = null;
private Transform parentB = null;
IEnumerator SetPlayer()
{
yield return null;
while (_PlayerA == null)
{
_PlayerA = FindPlayerObj(initData._OwnerAId);
yield return null;
}
while (_PlayerB == null)
{
_PlayerB = FindPlayerObj(initData._OwnerBId);
yield return null;
}
while(parentA == null)
{
parentA = FindTransform(_BindPointPathA);
yield return null;
}
while(parentB == null)
{
parentB = FindTransform(_BindPointPathB);
yield return null;
}
SetPlayer(_PlayerA, parentA, (initData._RoleBaseAttrId == 2 || initData._RoleBaseAttrId == 3) ? _AnimationIdA : _AnimationIdB, initData._OwnerAId);
SetPlayer(_PlayerB, parentB, (initData._RoleBaseAttrId == 2 || initData._RoleBaseAttrId == 3) ? _AnimationIdA : _AnimationIdB, initData._OwnerAId);
yield break;
}
void SetPlayer(Obj_OtherPlayer obj, Transform parent, int animationId, ulong guid)
{
if (obj == null)
{
WCBingObjInfo info = new WCBingObjInfo(guid, parent, animationId, 1.0f / _CurScaleVal);
if (GameManager.gameManager.PlayerDataPool._WCBindObjDic == null)
GameManager.gameManager.PlayerDataPool._WCBindObjDic = new Dictionary<ulong, WCBingObjInfo>();
if (!GameManager.gameManager.PlayerDataPool._WCBindObjDic.ContainsKey(guid))
GameManager.gameManager.PlayerDataPool._WCBindObjDic.Add(guid, info);
return;
}
obj.BindCloneModelToWC(parent, animationId, 1.0f / _CurScaleVal);
if (IsWCMainplayer(obj.GUID))
FocusOnCamera();
}
bool IsWCMainplayer(ulong guid)
{
if (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid == guid)
{
Debug.LogError("Is WC player");
return true;
}
return false;
}
void FocusOnCamera()
{
Debug.LogWarning("Focus Camera");
if (SceneLogic.CameraController.MoveOverrider == null)
{
var overrider = new WeddingCarCameraMovement(this);
SceneLogic.CameraController.SetCameraOverrider(overrider);
}
//if (GameManager.gameManager.PlayerDataPool.WCCamera == null)
//{
// GameManager.gameManager.PlayerDataPool.WCCamera = transform.GetComponentInChildren<Camera>(true);
// GameManager.gameManager.PlayerDataPool.WCCamera.enabled = true;
//}
//if(GameManager.gameManager.PlayerDataPool.WCCamera == null)
//{
// Debug.LogError("WCCamera is null");
// return;
//}
//if (!GameManager.gameManager.PlayerDataPool.WCCamera.isActiveAndEnabled)
// GameManager.gameManager.PlayerDataPool.WCCamera.gameObject.SetActive(true);
//SceneLogic.CameraController.ChangeFocusObj(this);
////SceneLogic.CameraController.OnWCMovie(true);
}
private List<ObjBindFlag> bindPointList;
Transform FindTransform(string path)
{
if (bindPointList == null)
{
bindPointList = new List<ObjBindFlag>();
foreach (var bind in transform.GetComponentsInChildren<ObjBindFlag>())
{
bindPointList.Add(bind);
}
}
for (int index = 0; index < bindPointList.Count; index++)
{
if (bindPointList[index].BindPointName.Equals(path))
return bindPointList[index].gameObject.transform;
}
LogModule.ErrorLog("找不到 : " + path);
return null;
}
Obj_OtherPlayer FindPlayerObj(ulong guid)
{
var obj = ObjManager.Instance.FindOtherPlayerByGuid(guid);
return obj;
}
}
public class WeddingCarCameraMovement : CameraController.CameraMovementOverrider
{
private const float _minDistance = 10f;
private const float _maxDistance = 30f;
private const float _cameraPitch = 30f;
private const float _cameraYaw =-135f;
private const float _cameraDistance = 18f;
private const float _fieldOfView = 45f;
private static readonly Vector3 _focusPoint = Vector3.up * 3.9f + Vector3.back * 1.25f;
private readonly Obj_WeddingCar _weddingCar;
private float _pitch;
private float _yaw;
private float _distance;
public WeddingCarCameraMovement(Obj_WeddingCar weddingCar)
{
_weddingCar = weddingCar;
}
public override bool MoveByOverride(CameraController controller)
{
var cameraMode = ProcessInput.Instance.inputModule.isCameraMode;
var rotation = Quaternion.Euler(_pitch, _yaw, 0f);
// 非CameraMode下
if (!cameraMode)
{
rotation = _weddingCar.Rotation * rotation;
}
controller.transform.rotation = rotation;
controller.transform.position =
_weddingCar.Position + _weddingCar.Rotation * _focusPoint + rotation * Vector3.back * _distance;
return true;
}
private void OnCameraModeChange(bool isCameraMode)
{
if (isCameraMode)
{
var rotation = _weddingCar.Rotation * Quaternion.Euler(_pitch, _yaw, 0f);
var eular = rotation.eulerAngles;
_pitch = eular.x;
_yaw = eular.y;
}
else
{
var rotation = Quaternion.Inverse(_weddingCar.Rotation) * Quaternion.Euler(_pitch, _yaw, 0f);
var eular = rotation.eulerAngles;
_pitch = eular.x;
_yaw = eular.y;
}
}
public override void Start(CameraController controller)
{
SceneLogic.CameraController.SetNoCullByDist(true);
SceneLogic.CameraController.SetCameraParameterListener(false);
SceneLogic.CameraController.FoVValue = _fieldOfView;
ProcessInput.Instance.inputModule.onCameraModeChange += OnCameraModeChange;
ProcessInput.Instance.inputModule.processCamera.onCameraAngle += OnCameraAngle;
ProcessInput.Instance.inputModule.processCamera.onCameraDistance += OnCameraDistance;
_distance = _cameraDistance;
// 将默认转换到世界坐标系
if (ProcessInput.Instance.inputModule.isCameraMode)
{
var rotation = _weddingCar.Rotation * Quaternion.Euler(_cameraPitch, _cameraYaw, 0f);
var eular = rotation.eulerAngles;
_pitch = eular.x;
_yaw = eular.y;
}
else
{
_pitch = _cameraPitch;
_yaw = _cameraYaw;
}
}
public override void End(CameraController controller)
{
SceneLogic.CameraController.SetNoCullByDist(false);
SceneLogic.CameraController.SetCameraParameterListener(true);
SceneLogic.CameraController.FoVValue = -1f;
ProcessInput.Instance.inputModule.onCameraModeChange -= OnCameraModeChange;
ProcessInput.Instance.inputModule.processCamera.onCameraAngle -= OnCameraAngle;
ProcessInput.Instance.inputModule.processCamera.onCameraDistance -= OnCameraDistance;
}
private void OnCameraAngle(Vector2 delta)
{
_pitch = Mathf.Clamp(_pitch - delta.y * GlobeVar.pitchPerDpi, GlobeVar.minPitch, GlobeVar.maxPitch);
_yaw = _yaw + delta.x * GlobeVar.yawPerDpi;
}
private void OnCameraDistance(float delta)
{
_distance = Mathf.Clamp(_distance - delta * GlobeVar.distancePerDpi, _minDistance, _maxDistance);
}
}