移动和旋转

This commit is contained in:
2025-09-07 23:50:53 +08:00
parent deaca48bf3
commit debfcf41f4
64 changed files with 1017 additions and 810 deletions

View File

@@ -812,7 +812,7 @@ MonoBehaviour:
videoPlayer: {fileID: 1810378423}
startCanvas: {fileID: 386239068}
playVideo: 0
controllerType: 1
controllerType: 0
--- !u!81 &2487858301405542861
AudioListener:
m_ObjectHideFlags: 0

View File

@@ -48,6 +48,9 @@ namespace NBF
public const string Run = "Run";
public const string Use1 = "Use1";
public const string Use2 = "Use2";
public const string Move = "Move";
public const string Look = "Look";
}
#region Load Icon

View File

@@ -1,10 +1,17 @@
using System;
using NBC.Entitas;
using NBC.Entitas.Interface;
using UnityEngine;
using UnityEngine.InputSystem;
namespace NBF.Fishing2
{
public enum ControllerType
{
KeyboardMouse = 0,
GamePad = 1
}
public class InputComponent : Entity
{
public PlayerInputControl PlayerInputControl { get; set; }
@@ -29,6 +36,21 @@ namespace NBF.Fishing2
/// </summary>
public event Action<string> OnPlayerCanceled;
/// <summary>
/// 执行输入事件
/// </summary>
public event Action<InputAction.CallbackContext> OnPlayerValuePerformed;
/// <summary>
/// 执行输入事件完毕
/// </summary>
public event Action<InputAction.CallbackContext> OnPlayerValueCanceled;
/// <summary>
/// 触发交互游戏对象
/// </summary>
public event Action<InteractiveObject> OnInteractiveObjectAction;
/// <summary>
/// 手柄输入
/// </summary>
@@ -39,51 +61,9 @@ namespace NBF.Fishing2
/// </summary>
public static bool IsUIStopInput;
public void OnUIButtonPerformed(InputAction.CallbackContext context)
{
OnUIPerformed?.Invoke(context.action.name);
}
public void OnUIButtonCanceled(InputAction.CallbackContext context)
{
OnUICanceled?.Invoke(context.action.name);
}
#region Event
public void OnPlayerButtonPerformed(InputAction.CallbackContext context)
{
if (IsUIStopInput) return;
var actionName = context.action.name;
// if (actionName == "Op1")
// {
// OnOp1Action?.Invoke(true);
// }
// else if (actionName == "Op2")
// {
// OnOp2Action?.Invoke(true);
// }
OnPlayerPerformed?.Invoke(actionName);
}
public void OnPlayerButtonCanceled(InputAction.CallbackContext context)
{
if (IsUIStopInput) return;
var actionName = context.action.name;
// if (actionName == "Op1")
// {
// OnOp1Action?.Invoke(false);
// }
// else if (actionName == "Op2")
// {
// OnOp2Action?.Invoke(false);
// }
//
OnPlayerCanceled?.Invoke(actionName);
}
}
public static class InputComponentSystem
{
public class InputComponentAwakeSystem : AwakeSystem<InputComponent>
{
protected override void Awake(InputComponent self)
@@ -114,6 +94,11 @@ namespace NBF.Fishing2
action.performed += self.OnPlayerButtonPerformed;
action.canceled += self.OnPlayerButtonCanceled;
}
else if (action.type == InputActionType.Value)
{
action.performed += self.OnInputPlayerValuePerformed;
action.canceled += self.OnInputPlayerValueCanceled;
}
}
}
}
@@ -147,10 +132,91 @@ namespace NBF.Fishing2
action.performed -= self.OnPlayerButtonPerformed;
action.canceled -= self.OnPlayerButtonCanceled;
}
else if (action.type == InputActionType.Value)
{
action.performed -= self.OnInputPlayerValuePerformed;
action.canceled -= self.OnInputPlayerValueCanceled;
}
}
}
}
}
}
public void OnUIButtonPerformed(InputAction.CallbackContext context)
{
OnUIPerformed?.Invoke(context.action.name);
}
private void OnUIButtonCanceled(InputAction.CallbackContext context)
{
OnUICanceled?.Invoke(context.action.name);
}
private void OnPlayerButtonPerformed(InputAction.CallbackContext context)
{
if (IsUIStopInput) return;
var actionName = context.action.name;
// if (actionName == "Op1")
// {
// OnOp1Action?.Invoke(true);
// }
// else if (actionName == "Op2")
// {
// OnOp2Action?.Invoke(true);
// }
OnPlayerPerformed?.Invoke(actionName);
}
private void OnPlayerButtonCanceled(InputAction.CallbackContext context)
{
if (IsUIStopInput) return;
var actionName = context.action.name;
// if (actionName == "Op1")
// {
// OnOp1Action?.Invoke(false);
// }
// else if (actionName == "Op2")
// {
// OnOp2Action?.Invoke(false);
// }
//
OnPlayerCanceled?.Invoke(actionName);
}
private void OnInputPlayerValuePerformed(InputAction.CallbackContext context)
{
if (IsUIStopInput) return;
OnPlayerValuePerformed?.Invoke(context);
}
private void OnInputPlayerValueCanceled(InputAction.CallbackContext context)
{
if (IsUIStopInput) return;
OnPlayerValueCanceled?.Invoke(context);
}
#endregion
public Vector2 GetMovementInput()
{
if (IsUIStopInput) return Vector2.zero;
return PlayerInputControl.Player.Move?.ReadValue<Vector2>() ?? Vector2.zero;
}
public Vector2 GetLookInput()
{
if (IsUIStopInput) return Vector2.zero;
return PlayerInputControl.Player.Look?.ReadValue<Vector2>() ?? Vector2.zero;
}
public void SendUIInput(string actionName)
{
OnUIPerformed?.Invoke(actionName);
OnUICanceled?.Invoke(actionName);
}
}
}

View File

@@ -13,21 +13,25 @@ namespace NBF.Fishing2
/// <summary>
/// 开始进入地图
/// </summary>
public static async FTask<int> EnterMap(int mapId, long roomId = 0)
public static async FTask<int> EnterMap(int mapId, string roomCode = "")
{
try
{
var root = App.Main;
var response = (Map2C_EnterMapResponse)await Net.Call(new C2Map_EnterMapRequest()
{
MapId = mapId,
RoomId = roomId
RoomId = roomCode
});
Log.Info($"进入地图请求返回={response.ErrorCode}");
//如果有房间
if (roomId > 0)
if (!string.IsNullOrEmpty(roomCode))
{
//加入房间并请求获取房间数据
await RoomHelper.EnterRoom(roomCode);
// mapId = roomMapId;
}
// 等待场景切换完成

View File

@@ -1,5 +1,7 @@
using System.Linq;
using NBC;
using Unity.Mathematics;
using UnityEngine;
namespace NBF.Fishing2
{
@@ -10,7 +12,6 @@ namespace NBF.Fishing2
MapUnitInfo mapUnit = new MapUnitInfo();
mapUnit.Id = self.RoleId;
mapUnit.RoleInfo = self.ToSimpleInfo();
mapUnit.Location = new MapUnitPositionInfo();
mapUnit.Gears = self.Gears.First();
mapUnit.FishingInfo = new UnitFishingInfo();
return mapUnit;
@@ -28,7 +29,55 @@ namespace NBF.Fishing2
return ret;
}
#region Vector
public static Vector3Info ToVector3Info(this Vector3 self)
{
var ret = new Vector3Info();
ret.x = self.x;
ret.y = self.y;
ret.z = self.z;
return ret;
}
public static QuaternionInfo ToQuaternionInfo(this Quaternion self)
{
var ret = new QuaternionInfo();
ret.x = self.x;
ret.y = self.y;
ret.z = self.z;
ret.w = self.w;
return ret;
}
public static Vector3 ToVector3(this Vector3Info self)
{
var ret = new Vector3
{
x = self.x,
y = self.y,
z = self.z
};
return ret;
}
public static Quaternion ToQuaternion(this QuaternionInfo self)
{
var ret = new Quaternion
{
x = self.x,
y = self.y,
z = self.z,
w = self.w
};
return ret;
}
#endregion
}
}

View File

@@ -0,0 +1,22 @@
using NBC;
namespace NBF.Fishing2
{
public class RoomHelper
{
public static async FTask EnterRoom(string roomCode)
{
var response = (G2C_EnterRoomResponse)await Net.Call(new C2G_EnterRoomRequest()
{
RoomCode = roomCode
});
Log.Info($"进入房间返回 Code={response.RoomCode} 房间玩家数量={response.Units.Count}");
// if (response.ErrorCode != 0)
// {
// return 0;
// }
// return response.MapId;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 0a565f17a34541a096ae34b8e67344d9
timeCreated: 1757244384

View File

@@ -9,6 +9,16 @@ namespace NBF.Fishing2
{
await FTask.CompletedTask;
}
public static bool IsSelf(this MapUnit self)
{
if (self.Id == Game.SelfId)
{
return true;
}
return false;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 9720afaa3bc94081b63a7c0571e4c86a
timeCreated: 1757251153

View File

@@ -0,0 +1,14 @@
using NBC;
using NBC.Network;
using NBC.Network.Interface;
namespace Fishing2.Map
{
public class Map2C_RoleEnterMapNotifyHandler : Message<Map2C_RoleEnterRoomNotify>
{
protected override async FTask Run(Session session, Map2C_RoleEnterRoomNotify message)
{
Log.Info($"收到进入房间推送 id={message.Info.Id} ");
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b0934eeab5b8445b824f1337f774379e
timeCreated: 1757251141

View File

@@ -0,0 +1,14 @@
using NBC;
using NBC.Network;
using NBC.Network.Interface;
namespace Fishing2.Map.Handler
{
public class Map2C_RoleExitMapNotifyHandler : Message<Map2C_RoleExitRoomNotify>
{
protected override async FTask Run(Session session, Map2C_RoleExitRoomNotify message)
{
Log.Info($"收到离开房间推送 id={message.Id} ");
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 18ae467167c44db1873fee88067d2f9a
timeCreated: 1757251193

View File

@@ -36,7 +36,7 @@ namespace NBF.Fishing2
public void CreteMapUnit(MapUnitInfo unitInfo)
{
var mapUnit = Entity.Create<MapUnit>(Scene, unitInfo.RoleInfo.RoleId, true, true);
var mapUnit = Entity.Create<MapUnit>(Scene, unitInfo.Id, true, true);
mapUnit.SetUnitInfo(unitInfo);
Add(mapUnit);
}

View File

@@ -0,0 +1,30 @@
using NBC;
using NBC.Network;
using NBC.Network.Interface;
namespace NBF.Fishing2
{
public class Map2C_LookNotifyHandler : Message<Map2C_LookeNotify>
{
protected override async FTask Run(Session session, Map2C_LookeNotify message)
{
Log.Info($"收到朝向推送 id={message.Id} ");
var map = App.Main.GetComponent<Map>();
var unit = map.Units[message.Id];
if (unit.IsSelf())
{
Log.Info("自己的旋转消息,不处理");
}
else
{
var moveComponent = unit.GetComponent<CharacterControllerComponent>();
if (moveComponent != null)
{
moveComponent.OnServerLook(message.Rotation.ToVector3(), message.Timestamp);
}
}
await FTask.CompletedTask;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f1f00b074c7f48248773361036d3bfcf
timeCreated: 1757238435

View File

@@ -0,0 +1,33 @@
using NBC;
using NBC.Network;
using NBC.Network.Interface;
namespace NBF.Fishing2
{
public class Map2C_MoveNotifyHandler : Message<Map2C_MoveNotify>
{
protected override async FTask Run(Session session, Map2C_MoveNotify message)
{
Log.Info($"收到移动推送 id={message.Id} stop={message.IsStop}");
// session.Scene
// session.Scene.GetComponent<MapUnitInfo>(message.Id),
var map = App.Main.GetComponent<Map>();
var unit = map.Units[message.Id];
var moveComponent = unit.GetComponent<CharacterControllerComponent>();
if (moveComponent != null)
{
if (message.IsStop)
{
moveComponent.OnServerStopMove(message.Position.ToVector3(), message.Timestamp);
}
else
{
moveComponent.OnServerStartMove(message.Position.ToVector3(),
message.Direction.ToVector3(), 3, message.Timestamp);
}
}
await FTask.CompletedTask;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2306a332c3f842e78fd8d70c9ef1f8ed
timeCreated: 1757148423

View File

@@ -1,339 +1,41 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using NBC;
using NBC.Entitas;
using NBC.Entitas.Interface;
using NBC.Helper;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.InputSystem;
namespace NBF.Fishing2
{
public class MoveComponent : Entity
[System.Serializable]
public struct MoveState
{
public float3 PreTarget
{
get { return this.Targets[this.N - 1]; }
}
public float3 NextTarget
{
get { return this.Targets[this.N]; }
}
// 开启移动协程的时间
public long BeginTime;
// 每个点的开始时间
public long StartTime { get; set; }
// 开启移动协程的Unit的位置
public float3 StartPos;
public float3 RealPos
{
get { return this.Targets[0]; }
}
private long needTime;
public long NeedTime
{
get { return this.needTime; }
set { this.needTime = value; }
}
public long MoveTimer;
public float Speed; // m/s
public FTask<bool> tcs;
public List<float3> Targets = new List<float3>();
public float3 FinalTarget
{
get { return this.Targets[^1]; }
}
public int N;
public int TurnTime;
public bool IsTurnHorizontal;
public quaternion From;
public quaternion To;
public Vector3 startPosition; // 开始移动时的位置
public Vector3 moveDirection; // 移动方向(标准化向量)
public float moveSpeed; // 移动速度
public bool isMoving; // 是否正在移动
public double serverTimestamp; // 服务器时间戳
}
public static class MoveComponentSystem
public class MoveComponent : Entity
{
public bool Run;
public readonly Queue<MoveState> MoveStateQueue = new Queue<MoveState>();
#region System
public class MoveComponentDestroySystem : DestroySystem<MoveComponent>
{
protected override void Destroy(MoveComponent self)
{
self.Run = false;
}
}
#endregion
public static bool IsArrived(this MoveComponent self)
{
return self.Targets.Count == 0;
}
public static bool ChangeSpeed(this MoveComponent self, float speed)
{
if (self.IsArrived())
{
return false;
}
if (speed < 0.0001)
{
return false;
}
MapUnit unit = self.GetParent<MapUnit>();
List<float3> path = new List<float3>();
self.MoveForward(false);
path.Add(unit.Position); // 第一个是Unit的pos
for (int i = self.N; i < self.Targets.Count; ++i)
{
path.Add(self.Targets[i]);
}
self.MoveToAsync(path, speed).Coroutine();
return true;
}
// 该方法不需要用cancelToken的方式取消因为即使不传入cancelToken多次调用该方法也要取消之前的移动协程,上层可以stop取消
public static async FTask<bool> MoveToAsync(this MoveComponent self, List<float3> target, float speed,
int turnTime = 100)
{
self.Stop(false);
foreach (float3 v in target)
{
self.Targets.Add(v);
}
self.IsTurnHorizontal = true;
self.TurnTime = turnTime;
self.Speed = speed;
self.tcs = FTask<bool>.Create(true);
self.Scene.EventComponent.Publish(new MoveStart() { Unit = self.GetParent<MapUnit>() });
self.StartMove();
bool moveRet = await self.tcs;
if (moveRet)
{
self.Scene.EventComponent.Publish(new MoveStop() { Unit = self.GetParent<MapUnit>() });
}
return moveRet;
}
// ret: 停止的时候,移动协程的返回值
private static void MoveForward(this MoveComponent self, bool ret)
{
MapUnit unit = self.GetParent<MapUnit>();
long timeNow = TimeHelper.Now;
long moveTime = timeNow - self.StartTime;
while (true)
{
if (moveTime <= 0)
{
return;
}
// 计算位置插值
if (moveTime >= self.NeedTime)
{
unit.Position = self.NextTarget;
if (self.TurnTime > 0)
{
unit.Rotation = self.To;
}
}
else
{
// 计算位置插值
float amount = moveTime * 1f / self.NeedTime;
if (amount > 0)
{
float3 newPos = math.lerp(self.StartPos, self.NextTarget, amount);
unit.Position = newPos;
}
// 计算方向插值
if (self.TurnTime > 0)
{
amount = moveTime * 1f / self.TurnTime;
if (amount > 1)
{
amount = 1f;
}
quaternion q = math.slerp(self.From, self.To, amount);
unit.Rotation = q;
}
}
moveTime -= self.NeedTime;
// 表示这个点还没走完,等下一帧再来
if (moveTime < 0)
{
return;
}
// 到这里说明这个点已经走完
// 如果是最后一个点
if (self.N >= self.Targets.Count - 1)
{
unit.Position = self.NextTarget;
unit.Rotation = self.To;
self.MoveFinish(ret);
return;
}
self.SetNextTarget();
}
}
private static void StartMove(this MoveComponent self)
{
self.BeginTime = TimeHelper.Now;
self.StartTime = self.BeginTime;
self.SetNextTarget();
// self.Scene.TimerComponent.Net.RepeatedTimer()
self.MoveTimer = self.Scene.TimerComponent.Net.RepeatedTimer(1000 * 60, () =>
{
try
{
self.MoveForward(true);
}
catch (Exception e)
{
Log.Error($"move timer error: {self.Id}\n{e}");
}
});
}
private static void SetNextTarget(this MoveComponent self)
{
MapUnit unit = self.GetParent<MapUnit>();
++self.N;
// 时间计算用服务端的位置, 但是移动要用客户端的位置来插值
float3 v = self.GetFaceV();
float distance = math.length(v);
// 插值的起始点要以unit的真实位置来算
self.StartPos = unit.Position;
self.StartTime += self.NeedTime;
self.NeedTime = (long)(distance / self.Speed * 1000);
if (self.TurnTime > 0)
{
// 要用unit的位置
float3 faceV = self.GetFaceV();
if (math.lengthsq(faceV) < 0.0001f)
{
return;
}
self.From = unit.Rotation;
if (self.IsTurnHorizontal)
{
faceV.y = 0;
}
if (Math.Abs(faceV.x) > 0.01 || Math.Abs(faceV.z) > 0.01)
{
self.To = quaternion.LookRotation(faceV, math.up());
}
return;
}
if (self.TurnTime == 0) // turn time == 0 立即转向
{
float3 faceV = self.GetFaceV();
if (self.IsTurnHorizontal)
{
faceV.y = 0;
}
if (Math.Abs(faceV.x) > 0.01 || Math.Abs(faceV.z) > 0.01)
{
self.To = quaternion.LookRotation(faceV, math.up());
unit.Rotation = self.To;
}
}
}
private static float3 GetFaceV(this MoveComponent self)
{
return self.NextTarget - self.PreTarget;
}
public static bool FlashTo(this MoveComponent self, float3 target)
{
MapUnit unit = self.GetParent<MapUnit>();
unit.Position = target;
return true;
}
// ret: 停止的时候,移动协程的返回值
public static void Stop(this MoveComponent self, bool ret)
{
if (self.Targets.Count > 0)
{
self.MoveForward(ret);
}
self.MoveFinish(ret);
if (!ret)
{
self.Scene.EventComponent.Publish( new MoveStop() { Unit = self.GetParent<MapUnit>() });
}
}
private static void MoveFinish(this MoveComponent self, bool ret)
{
if (self.StartTime == 0)
{
return;
}
self.StartTime = 0;
self.StartPos = float3.zero;
self.BeginTime = 0;
self.NeedTime = 0;
self.Targets.Clear();
self.Speed = 0;
self.N = 0;
self.TurnTime = 0;
self.IsTurnHorizontal = false;
self.Scene.TimerComponent.Net.Remove(self.MoveTimer);
if (self.tcs != null)
{
var tcs = self.tcs;
self.tcs = null;
tcs.SetResult(ret);
}
}
}
}

View File

@@ -1,17 +1,14 @@
namespace NBF.Fishing2
using NBC;
using UnityEngine;
namespace NBF.Fishing2
{
public struct MoveStart
public struct MoveChange
{
public MapUnit Unit;
}
public struct MoveStop
{
public MapUnit Unit;
}
public struct MoveTimer
{
public Vector3 Position;
public Quaternion Rotation;
public Vector2Info Direction;
public bool IsStop;
}
}

View File

@@ -6,7 +6,7 @@ namespace NBF.Fishing2
{
public class Role : Entity
{
public long RoomId { get; set; }
public string RoomCode { get; set; }
public RoleInfo Info { get; set; }
@@ -14,7 +14,7 @@ namespace NBF.Fishing2
{
protected override void Destroy(Role self)
{
self.RoomId = 0;
self.RoomCode = string.Empty;
self.Info = null;
}
}
@@ -22,7 +22,7 @@ namespace NBF.Fishing2
public async FTask GetRoleInfo()
{
var response = (Game2C_GetRoleInfoResponse)await Net.Call(new C2Game_GetRoleInfoRequest());
RoomId = response.RoomId;
RoomCode = response.RoomCode;
Info = response.RoleInfo;
}
@@ -32,6 +32,12 @@ namespace NBF.Fishing2
mapUnit.Id = Id;
mapUnit.RoleInfo = new RoleSimpleInfo()
{
RoleId = Id,
NickName = Info.BaseInfo.NickName,
Head = Info.BaseInfo.Head,
Country = Info.BaseInfo.Country,
Level = Info.BaseInfo.Level,
Vip = Info.BaseInfo.Vip
};
return mapUnit;

View File

@@ -2,6 +2,7 @@
using NBC;
using NBC.Entitas;
using Unity.Mathematics;
using UnityEngine;
namespace NBF.Fishing2
{
@@ -12,34 +13,34 @@ namespace NBF.Fishing2
{
public int ConfigId { get; set; } //配置表id
private float3 position; //坐标
private Vector3 position; //坐标
public float3 Position
public Vector3 Position
{
get => position;
set
{
float3 oldPos = position;
Vector3 oldPos = position;
position = value;
Scene.EventComponent.Publish(new ChangePosition() { MapUnit = this, OldPos = oldPos });
// Scene.EventComponent.Publish(new ChangePosition() { MapUnit = this, OldPos = oldPos });
}
}
public float3 Forward
public Vector3 Forward
{
get => math.mul(Rotation, math.forward());
set => Rotation = quaternion.LookRotation(value, math.up());
set => Rotation = Quaternion.LookRotation(value, math.up());
}
private quaternion rotation;
private Quaternion rotation;
public quaternion Rotation
public Quaternion Rotation
{
get => rotation;
set
{
rotation = value;
Scene.EventComponent.Publish(new ChangeRotation() { MapUnit = this });
// Scene.EventComponent.Publish(new ChangeRotation() { MapUnit = this });
}
}
@@ -54,7 +55,7 @@ namespace NBF.Fishing2
public void SetUnitInfo(MapUnitInfo unitInfo)
{
var moveComponent = GetOrAddComponent<MoveComponent>();
GetOrAddComponent<MoveComponent>();
GetOrAddComponent<ObjectWait>();
var unitBasic = GetOrAddComponent<MapUnitBasic>();
unitBasic.UpdateInfo(unitInfo);

View File

@@ -0,0 +1,331 @@
using System.Collections.Generic;
using NBC;
using NBC.Entitas;
using NBC.Entitas.Interface;
using NBC.Helper;
using UnityEngine;
using UnityEngine.InputSystem;
namespace NBF.Fishing2
{
public class CharacterControllerComponent : Entity
{
public CharacterController characterController;
public readonly Queue<MoveState> MoveStateQueue = new Queue<MoveState>();
public Transform transform => characterController.transform;
private MoveState currentMoveState;
private Vector3 networkPosition;
// private Vector3 networkFacingDirection;
// 插值平滑参数
public float positionLerpSpeed = 10f;
public float rotationLerpSpeed = 10f;
[Tooltip("视角旋转敏感度")] public Vector2 sensitivity = new Vector2(0.015f, 0.015f);
public float minPitch = -40.0f;
public float maxPitch = 75.0f;
#region System
public class MoveComponentDestroySystem : DestroySystem<CharacterControllerComponent>
{
protected override void Destroy(CharacterControllerComponent self)
{
self.characterController = null;
var mapUnit = self.Parent as MapUnit;
if (mapUnit.IsSelf())
{
var inputComponent = self.Scene.GetComponent<InputComponent>();
if (inputComponent != null)
{
inputComponent.OnPlayerPerformed -= self.OnPlayerCanceled;
inputComponent.OnPlayerPerformed -= self.OnPlayerPerformed;
inputComponent.OnPlayerValueCanceled -= self.OnPlayerValueCanceled;
inputComponent.OnPlayerValuePerformed -= self.OnPlayerValuePerformed;
}
}
}
}
public class MoveComponentAwakeSystem : AwakeSystem<CharacterControllerComponent>
{
protected override void Awake(CharacterControllerComponent self)
{
var unitUnityComponent = self.Parent.GetComponent<UnitUnityComponent>();
self.characterController = unitUnityComponent.GameObject.GetComponent<CharacterController>();
self.lastSyncedFacing = self.characterController.transform.forward;
var mapUnit = self.Parent as MapUnit;
if (mapUnit.IsSelf())
{
var inputComponent = self.Scene.GetComponent<InputComponent>();
inputComponent.OnPlayerPerformed += self.OnPlayerCanceled;
inputComponent.OnPlayerPerformed += self.OnPlayerPerformed;
inputComponent.OnPlayerValueCanceled += self.OnPlayerValueCanceled;
inputComponent.OnPlayerValuePerformed += self.OnPlayerValuePerformed;
}
}
}
public class MoveComponentUpdateSystem : UpdateSystem<CharacterControllerComponent>
{
protected override void Update(CharacterControllerComponent self)
{
self.ProcessMoveStates();
self.CheckRotationSync();
var mapUnit = self.Parent as MapUnit;
mapUnit.Position = self.characterController.transform.position;
mapUnit.Rotation = self.characterController.transform.rotation;
var f = mapUnit.Forward;
}
}
#endregion
#region Input
private void OnPlayerPerformed(string action)
{
if (action == InputDef.Player.Run)
{
// Run = true;
}
}
private void OnPlayerCanceled(string action)
{
if (action == InputDef.Player.Run)
{
// Run = false;
}
}
private void OnPlayerValueCanceled(InputAction.CallbackContext context)
{
var name = context.action.name;
if (name == InputDef.Player.Move)
{
var v2 = context.ReadValue<Vector2>();
SendMoveMessage(v2, true);
}
}
private void OnPlayerValuePerformed(InputAction.CallbackContext context)
{
var name = context.action.name;
if (name == InputDef.Player.Move)
{
var v2 = context.ReadValue<Vector2>();
SendMoveMessage(v2, false);
}
else if (name == InputDef.Player.Look)
{
var v2 = context.ReadValue<Vector2>();
UpdatePlayerRotation(v2);
}
}
#endregion
#region Message
private void SendMoveMessage(Vector3 movementInput, bool isStop = false)
{
var mapUnit = Parent as MapUnit;
Vector3 movementDirection = Vector3.zero;
movementDirection += Vector3.forward * movementInput.y;
movementDirection += Vector3.right * movementInput.x;
Net.Send(new C2Map_Move()
{
Direction = movementDirection.ToVector3Info(),
IsStop = isStop,
Timestamp = TimeHelper.Now,
Position = mapUnit.Position.ToVector3Info(),
Rotation = mapUnit.Forward.ToVector3Info(),
});
}
private void SendLookMessage()
{
Log.Info("发送朝向同步消息");
Net.Send(new C2Map_Look()
{
Rotation = characterController.transform.forward.ToVector3Info(),
Timestamp = TimeHelper.Now
});
}
/// <summary>
/// 接收服务器移动开始通知
/// </summary>
/// <param name="startPosition"></param>
/// <param name="moveDirection"></param>
/// <param name="facingDirection"></param>
/// <param name="speed"></param>
/// <param name="timestamp"></param>
public void OnServerStartMove(Vector3 startPosition, Vector3 moveDirection, float speed, double timestamp)
{
MoveState moveState = new MoveState
{
startPosition = startPosition,
moveDirection = moveDirection.normalized,
moveSpeed = speed,
isMoving = true,
serverTimestamp = timestamp
};
MoveStateQueue.Enqueue(moveState);
Log.Info($"MoveStateQueue Count={MoveStateQueue.Count}");
}
/// <summary>
/// 接收服务器移动停止通知
/// </summary>
/// <param name="finalPosition"></param>
/// <param name="finalFacing"></param>
/// <param name="timestamp"></param>
public void OnServerStopMove(Vector3 finalPosition, double timestamp)
{
MoveState moveState = new MoveState
{
startPosition = finalPosition,
moveDirection = Vector3.zero,
moveSpeed = 0f,
isMoving = false,
serverTimestamp = timestamp
};
MoveStateQueue.Enqueue(moveState);
Log.Info($"MoveStateQueue Count={MoveStateQueue.Count}");
}
public void OnServerLook(Vector3 rotation, double timestamp)
{
}
#endregion
#region Move
private void ProcessMoveStates()
{
// 只有在当前状态不是移动状态时,才处理下一个状态
if (MoveStateQueue.Count > 0)
{
currentMoveState = MoveStateQueue.Dequeue();
if (currentMoveState.isMoving)
{
StartMovement(currentMoveState);
}
else
{
StopMovement(currentMoveState);
}
}
// 如果正在移动,持续更新
if (currentMoveState.isMoving)
{
UpdateMovement();
// 检查是否需要自动停止(可选)
// 例如基于时间或距离的条件
}
}
private void StartMovement(MoveState moveState)
{
networkPosition = moveState.startPosition;
// networkFacingDirection = moveState.currentFacing;
Debug.Log($"开始移动 - 位置: {moveState.startPosition}");
}
private void StopMovement(MoveState moveState)
{
networkPosition = moveState.startPosition;
// networkFacingDirection = moveState.currentFacing;
Debug.Log($"停止移动 - 最终位置: {moveState.startPosition}");
}
private void UpdateMovement()
{
var movementDirection =
currentMoveState.moveDirection.relativeTo(BaseCamera.Main.transform, characterController.transform.up);
Vector3 movement = movementDirection * currentMoveState.moveSpeed * Time.deltaTime;
networkPosition += movement;
characterController.Move(movement);
// 如果移动方向不为零,可以自动更新朝向
if (currentMoveState.moveDirection != Vector3.zero)
{
// networkFacingDirection = currentMoveState.moveDirection;
}
}
#endregion
#region Look
public float rotationSyncInterval = 0.15f;
public float minRotationChange = 10f;
private Vector3 _rotationInput = Vector3.zero;
private float _cameraPitch;
private float rotationSyncTimer;
private Vector3 lastSyncedFacing;
private void UpdatePlayerRotation(Vector2 lookValue)
{
// Look
Vector2 lookInput = lookValue * sensitivity;
if (lookInput.x != 0.0f)
{
_rotationInput.y += lookInput.x;
}
// Player.CameraRoot.transform.localRotation = Quaternion.Euler(_cameraPitch, 0.0f, 0.0f);
if (_rotationInput != Vector3.zero)
{
characterController.transform.rotation *= Quaternion.Euler(_rotationInput);
_rotationInput = Vector3.zero;
}
}
// 检查朝向同步
private void CheckRotationSync()
{
rotationSyncTimer += Time.deltaTime;
if (rotationSyncTimer >= rotationSyncInterval)
{
float angleChange = Vector3.Angle(transform.forward, lastSyncedFacing);
if (angleChange >= minRotationChange)
{
SendLookMessage();
lastSyncedFacing = transform.forward;
rotationSyncTimer = 0f;
}
}
}
#endregion
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 36fb267f0f5149caa23ac1b6cf005067
timeCreated: 1757164955

View File

@@ -22,6 +22,7 @@ namespace NBF.Fishing2
GameObject = gameObject;
Transform = gameObject.transform;
Animator = gameObject.GetComponent<Animator>();
Parent.AddComponent<CharacterControllerComponent>();
}

View File

@@ -4,13 +4,13 @@ using UnityEngine;
namespace NBF
{
public class Global : MonoBehaviour
public class Game : MonoBehaviour
{
public static Global Instance { get; private set; }
public static Game Instance { get; private set; }
public static InputComponent Input;
/// <summary>
/// 主摄像机
/// </summary>
@@ -21,10 +21,13 @@ namespace NBF
/// </summary>
public static CameraScriptObject CameraConfig { get; private set; }
public static long SelfId;
private void Awake()
{
Instance = this;
CameraConfig = Resources.Load<CameraScriptObject>(nameof(CameraConfig));
}
}
}

View File

@@ -181,7 +181,7 @@ namespace NBC
[ProtoMember(1)]
public int MapId { get; set; }
[ProtoMember(2)]
public long RoomId { get; set; }
public string RoomId { get; set; }
}
[ProtoContract]
public partial class Map2C_EnterMapResponse : AMessage, ICustomRouteResponse, IProto

View File

@@ -33,6 +33,26 @@ namespace NBC
public float z { get; set; }
}
[ProtoContract]
public partial class Vector2Info : AMessage, IProto
{
public static Vector2Info Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Vector2Info>();
}
public override void Dispose()
{
x = default;
y = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Vector2Info>(this);
#endif
}
[ProtoMember(1)]
public float x { get; set; }
[ProtoMember(2)]
public float y { get; set; }
}
[ProtoContract]
public partial class QuaternionInfo : AMessage, IProto
{
public static QuaternionInfo Create(Scene scene)
@@ -115,7 +135,8 @@ namespace NBC
{
Id = default;
RoleInfo = default;
Location = default;
Position = default;
Rotation = default;
State = default;
Gears = default;
FishingInfo = default;
@@ -129,34 +150,16 @@ namespace NBC
[ProtoMember(2)]
public RoleSimpleInfo RoleInfo { get; set; }
[ProtoMember(3)]
public MapUnitPositionInfo Location { get; set; }
public Vector3Info Position { get; set; }
[ProtoMember(4)]
public UnitStateInfo State { get; set; }
public Vector3Info Rotation { get; set; }
[ProtoMember(5)]
public GearInfo Gears { get; set; }
public UnitStateInfo State { get; set; }
[ProtoMember(6)]
public UnitFishingInfo FishingInfo { get; set; }
public GearInfo Gears { get; set; }
[ProtoMember(7)]
public UnitFishingInfo FishingInfo { get; set; }
[ProtoMember(8)]
public List<KeyValueInt32> KV = new List<KeyValueInt32>();
}
[ProtoContract]
public partial class MapUnitPositionInfo : AMessage, IProto
{
public static MapUnitPositionInfo Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<MapUnitPositionInfo>();
}
public override void Dispose()
{
Position = default;
Rotation = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<MapUnitPositionInfo>(this);
#endif
}
[ProtoMember(1)]
public Vector3Info Position { get; set; }
[ProtoMember(2)]
public QuaternionInfo Rotation { get; set; }
}
}

View File

@@ -151,7 +151,7 @@ namespace NBC
{
ErrorCode = default;
RoleInfo = default;
RoomId = default;
RoomCode = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Game2C_GetRoleInfoResponse>(this);
#endif
@@ -160,7 +160,7 @@ namespace NBC
[ProtoMember(1)]
public RoleInfo RoleInfo { get; set; }
[ProtoMember(2)]
public long RoomId { get; set; }
public string RoomCode { get; set; }
[ProtoMember(3)]
public uint ErrorCode { get; set; }
}

View File

@@ -18,45 +18,46 @@ namespace Fantasy
public const uint G2C_RepeatLogin = 134227729;
public const uint C2Game_GetRoleInfoRequest = 2281711379;
public const uint Game2C_GetRoleInfoResponse = 2415929107;
public const uint C2Map_EnterRoomRequest = 2281711380;
public const uint Map2C_EnterRoomResponse = 2415929108;
public const uint C2Map_Move = 2147493650;
public const uint Map2C_RoleEnterMapNotify = 2147493651;
public const uint Map2C_RoleExitMapNotify = 2147493652;
public const uint Map2C_RoleStateNotify = 2147493653;
public const uint Map2C_RoleGearStateNotify = 2147493654;
public const uint Map2C_RoleGearChangeNotify = 2147493655;
public const uint C2S_GetConversationsRequest = 2281711381;
public const uint S2C_GetConversationsResponse = 2415929109;
public const uint C2S_SendMailRequest = 2281711382;
public const uint S2C_SendMailResponse = 2415929110;
public const uint C2S_DeleteMailRequest = 2281711383;
public const uint S2C_DeleteMailResponse = 2415929111;
public const uint S2C_HaveMail = 2147493656;
public const uint S2C_MailState = 2147493657;
public const uint C2S_CreateChannelRequest = 2281711384;
public const uint S2C_CreateChannelResponse = 2415929112;
public const uint C2S_JoinChannelRequest = 2281711385;
public const uint S2C_JoinChannelResponse = 2415929113;
public const uint C2S_SendMessageRequest = 2281711386;
public const uint S2C_SendMessageResponse = 2415929114;
public const uint S2C_Message = 2147493658;
public const uint C2S_CreateClubRequest = 2281711387;
public const uint S2C_CreateClubResponse = 2415929115;
public const uint C2S_GetClubInfoRequest = 2281711388;
public const uint S2C_GetClubInfoResponse = 2415929116;
public const uint C2S_GetMemberListRequest = 2281711389;
public const uint S2C_GetMemberListResponse = 2415929117;
public const uint C2S_GetClubListRequest = 2281711390;
public const uint S2C_GetClubListResponse = 2415929118;
public const uint C2S_JoinClubRequest = 2281711391;
public const uint S2C_JoinClubResponse = 2415929119;
public const uint C2S_LeaveClubRequest = 2281711392;
public const uint S2C_LeaveClubResponse = 2415929120;
public const uint C2S_DissolveClubRequest = 2281711393;
public const uint S2C_DissolveClubResponse = 2415929121;
public const uint C2S_DisposeJoinRequest = 2281711394;
public const uint S2C_DisposeJoinResponse = 2415929122;
public const uint S2C_ClubChange = 2147493659;
public const uint Map2C_RoleEnterRoomNotify = 2147493650;
public const uint Map2C_RoleExitRoomNotify = 2147493651;
public const uint Map2C_RoleStateNotify = 2147493652;
public const uint Map2C_RoleGearStateNotify = 2147493653;
public const uint Map2C_RoleGearChangeNotify = 2147493654;
public const uint C2Map_Move = 2147493655;
public const uint C2Map_Look = 2147493656;
public const uint Map2C_MoveNotify = 2147493657;
public const uint Map2C_LookeNotify = 2147493658;
public const uint C2S_GetConversationsRequest = 2281711380;
public const uint S2C_GetConversationsResponse = 2415929108;
public const uint C2S_SendMailRequest = 2281711381;
public const uint S2C_SendMailResponse = 2415929109;
public const uint C2S_DeleteMailRequest = 2281711382;
public const uint S2C_DeleteMailResponse = 2415929110;
public const uint S2C_HaveMail = 2147493659;
public const uint S2C_MailState = 2147493660;
public const uint C2S_CreateChannelRequest = 2281711383;
public const uint S2C_CreateChannelResponse = 2415929111;
public const uint C2S_JoinChannelRequest = 2281711384;
public const uint S2C_JoinChannelResponse = 2415929112;
public const uint C2S_SendMessageRequest = 2281711385;
public const uint S2C_SendMessageResponse = 2415929113;
public const uint S2C_Message = 2147493661;
public const uint C2S_CreateClubRequest = 2281711386;
public const uint S2C_CreateClubResponse = 2415929114;
public const uint C2S_GetClubInfoRequest = 2281711387;
public const uint S2C_GetClubInfoResponse = 2415929115;
public const uint C2S_GetMemberListRequest = 2281711388;
public const uint S2C_GetMemberListResponse = 2415929116;
public const uint C2S_GetClubListRequest = 2281711389;
public const uint S2C_GetClubListResponse = 2415929117;
public const uint C2S_JoinClubRequest = 2281711390;
public const uint S2C_JoinClubResponse = 2415929118;
public const uint C2S_LeaveClubRequest = 2281711391;
public const uint S2C_LeaveClubResponse = 2415929119;
public const uint C2S_DissolveClubRequest = 2281711392;
public const uint S2C_DissolveClubResponse = 2415929120;
public const uint C2S_DisposeJoinRequest = 2281711393;
public const uint S2C_DisposeJoinResponse = 2415929121;
public const uint S2C_ClubChange = 2147493662;
}
}

View File

@@ -9,96 +9,24 @@ using NBC.Serialize;
namespace NBC
{
[ProtoContract]
public partial class C2Map_EnterRoomRequest : AMessage, ICustomRouteRequest, IProto
{
public static C2Map_EnterRoomRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2Map_EnterRoomRequest>();
}
public override void Dispose()
{
MapId = default;
Password = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2Map_EnterRoomRequest>(this);
#endif
}
[ProtoIgnore]
public Map2C_EnterRoomResponse ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.C2Map_EnterRoomRequest; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MapRoute;
[ProtoMember(1)]
public int MapId { get; set; }
[ProtoMember(2)]
public string Password { get; set; }
}
[ProtoContract]
public partial class Map2C_EnterRoomResponse : AMessage, ICustomRouteResponse, IProto
{
public static Map2C_EnterRoomResponse Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Map2C_EnterRoomResponse>();
}
public override void Dispose()
{
ErrorCode = default;
MapId = default;
RoomId = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Map2C_EnterRoomResponse>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Map2C_EnterRoomResponse; }
[ProtoMember(1)]
public int MapId { get; set; }
[ProtoMember(2)]
public long RoomId { get; set; }
[ProtoMember(3)]
public uint ErrorCode { get; set; }
}
[ProtoContract]
public partial class C2Map_Move : AMessage, ICustomRouteMessage, IProto
{
public static C2Map_Move Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2Map_Move>();
}
public override void Dispose()
{
Location = default;
IsStop = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2Map_Move>(this);
#endif
}
public uint OpCode() { return OuterOpcode.C2Map_Move; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MapRoute;
[ProtoMember(1)]
public MapUnitPositionInfo Location { get; set; }
[ProtoMember(2)]
public bool IsStop { get; set; }
}
/// <summary>
/// 用户进入地图
/// </summary>
[ProtoContract]
public partial class Map2C_RoleEnterMapNotify : AMessage, ICustomRouteMessage, IProto
public partial class Map2C_RoleEnterRoomNotify : AMessage, ICustomRouteMessage, IProto
{
public static Map2C_RoleEnterMapNotify Create(Scene scene)
public static Map2C_RoleEnterRoomNotify Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Map2C_RoleEnterMapNotify>();
return scene.MessagePoolComponent.Rent<Map2C_RoleEnterRoomNotify>();
}
public override void Dispose()
{
Info = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Map2C_RoleEnterMapNotify>(this);
GetScene().MessagePoolComponent.Return<Map2C_RoleEnterRoomNotify>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Map2C_RoleEnterMapNotify; }
public uint OpCode() { return OuterOpcode.Map2C_RoleEnterRoomNotify; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MapRoute;
[ProtoMember(1)]
@@ -108,20 +36,20 @@ namespace NBC
/// 用户离开地图
/// </summary>
[ProtoContract]
public partial class Map2C_RoleExitMapNotify : AMessage, ICustomRouteMessage, IProto
public partial class Map2C_RoleExitRoomNotify : AMessage, ICustomRouteMessage, IProto
{
public static Map2C_RoleExitMapNotify Create(Scene scene)
public static Map2C_RoleExitRoomNotify Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Map2C_RoleExitMapNotify>();
return scene.MessagePoolComponent.Rent<Map2C_RoleExitRoomNotify>();
}
public override void Dispose()
{
Id = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Map2C_RoleExitMapNotify>(this);
GetScene().MessagePoolComponent.Return<Map2C_RoleExitRoomNotify>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Map2C_RoleExitMapNotify; }
public uint OpCode() { return OuterOpcode.Map2C_RoleExitRoomNotify; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MapRoute;
[ProtoMember(1)]
@@ -205,11 +133,66 @@ namespace NBC
[ProtoMember(2)]
public GearInfo Gears { get; set; }
}
[ProtoContract]
public partial class C2Map_Move : AMessage, ICustomRouteMessage, IProto
{
public static C2Map_Move Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2Map_Move>();
}
public override void Dispose()
{
Position = default;
Rotation = default;
Direction = default;
IsStop = default;
Timestamp = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2Map_Move>(this);
#endif
}
public uint OpCode() { return OuterOpcode.C2Map_Move; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MapRoute;
[ProtoMember(1)]
public Vector3Info Position { get; set; }
[ProtoMember(2)]
public Vector3Info Rotation { get; set; }
[ProtoMember(3)]
public Vector3Info Direction { get; set; }
[ProtoMember(4)]
public bool IsStop { get; set; }
[ProtoMember(5)]
public long Timestamp { get; set; }
}
[ProtoContract]
public partial class C2Map_Look : AMessage, ICustomRouteMessage, IProto
{
public static C2Map_Look Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2Map_Look>();
}
public override void Dispose()
{
Rotation = default;
Timestamp = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2Map_Look>(this);
#endif
}
public uint OpCode() { return OuterOpcode.C2Map_Look; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MapRoute;
[ProtoMember(1)]
public Vector3Info Rotation { get; set; }
[ProtoMember(2)]
public long Timestamp { get; set; }
}
/// <summary>
/// 玩家位置变化
/// 玩家移动推送
/// </summary>
[ProtoContract]
public partial class Map2C_MoveNotify : AMessage, IProto
public partial class Map2C_MoveNotify : AMessage, ICustomRouteMessage, IProto
{
public static Map2C_MoveNotify Create(Scene scene)
{
@@ -218,14 +201,58 @@ namespace NBC
public override void Dispose()
{
Id = default;
Location = default;
Position = default;
Rotation = default;
Direction = default;
IsStop = default;
Timestamp = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Map2C_MoveNotify>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Map2C_MoveNotify; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MapRoute;
[ProtoMember(1)]
public long Id { get; set; }
[ProtoMember(2)]
public MapUnitPositionInfo Location { get; set; }
public Vector3Info Position { get; set; }
[ProtoMember(3)]
public Vector3Info Rotation { get; set; }
[ProtoMember(4)]
public Vector3Info Direction { get; set; }
[ProtoMember(5)]
public bool IsStop { get; set; }
[ProtoMember(6)]
public long Timestamp { get; set; }
}
/// <summary>
/// 玩家旋转推送
/// </summary>
[ProtoContract]
public partial class Map2C_LookeNotify : AMessage, ICustomRouteMessage, IProto
{
public static Map2C_LookeNotify Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Map2C_LookeNotify>();
}
public override void Dispose()
{
Id = default;
Rotation = default;
Timestamp = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Map2C_LookeNotify>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Map2C_LookeNotify; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MapRoute;
[ProtoMember(1)]
public long Id { get; set; }
[ProtoMember(2)]
public Vector3Info Rotation { get; set; }
[ProtoMember(3)]
public long Timestamp { get; set; }
}
}

View File

@@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using FairyGUI;
using NBC;
using NBF.Fishing2;
using UnityEngine;
using UnityEngine.Video;
@@ -99,12 +101,12 @@ namespace NBF
public void StartGame()
{
Screen.SetResolution(1280, 720, FullScreenMode.Windowed);
PermanentCommon.Init();
InputDef.LoadIcon();
// UI.Inst.OpenUI<FishingShopPanel>();
LoadData();
CommonTopPanel.Show();
LoginPanel.Show();
OpenUI().Coroutine();
}
private void LoadData()
@@ -112,6 +114,13 @@ namespace NBF
ConfigAssets.Init();
}
private async FTask OpenUI()
{
await Task.Delay(100);
CommonTopPanel.Show();
LoginPanel.Show();
}
#region New
public ControllerType controllerType = ControllerType.GamePad;

View File

@@ -39,8 +39,8 @@ namespace NBF
}
}
Log.Error($"showCursor={showCursor}");
InputManager.IsUIStopInput = showCursor;
InputManager.SetMouseCursor(showCursor);
// Game.Input.IsUIStopInput = showCursor;
// Game.Input.SetMouseCursor(showCursor);
}
}
}

View File

@@ -1,212 +0,0 @@
using System;
using System.Runtime.InteropServices;
using NBC;
// using Rewired;
using UnityEngine;
using UnityEngine.InputSystem;
namespace NBF
{
public enum ControllerType
{
KeyboardMouse = 0,
GamePad = 1
}
public class InputManager : MonoService<InputManager>
{
public static bool IsOp1;
public static bool IsOp2;
public static event Action<bool> OnOp1Action;
public static event Action<bool> OnOp2Action;
/// <summary>
/// 执行输入事件
/// </summary>
public static event Action<string> OnUIPerformed;
/// <summary>
/// 执行输入事件完毕
/// </summary>
public static event Action<string> OnUICanceled;
/// <summary>
/// 执行输入事件
/// </summary>
public static event Action<string> OnPlayerPerformed;
/// <summary>
/// 执行输入事件完毕
/// </summary>
public static event Action<string> OnPlayerCanceled;
/// <summary>
/// 触发交互游戏对象
/// </summary>
public static event Action<InteractiveObject> OnInteractiveObjectAction;
public static PlayerInputControl PlayerInputControl { get; private set; }
/// <summary>
/// 手柄输入
/// </summary>
public static bool IsControllerInput;
/// <summary>
/// ui阻止游戏输入
/// </summary>
public static bool IsUIStopInput;
public static ControllerType ControllerType = ControllerType.KeyboardMouse;
protected override void OnAwake()
{
InputCursorExtension.InputInit();
DontDestroyOnLoad(gameObject);
PlayerInputControl = new PlayerInputControl();
PlayerInputControl.Enable();
}
private void Start()
{
AddEvent();
}
private void OnDestroy()
{
RemoveEvent();
InputCursorExtension.Dispose();
}
public static void SetMouseCursor(bool val)
{
if (val)
{
if (ControllerType == ControllerType.KeyboardMouse)
{
Cursor.visible = true;
}
Cursor.lockState = CursorLockMode.None;
}
else if (ControllerType == ControllerType.KeyboardMouse)
{
Cursor.visible = false;
}
Cursor.visible = val;
if (!val)
{
Cursor.lockState = CursorLockMode.Confined;
}
}
public static Vector2 GetMovementInput()
{
if (IsUIStopInput) return Vector2.zero;
return PlayerInputControl.Player.Move?.ReadValue<Vector2>() ?? Vector2.zero;
}
public static Vector2 GetLookInput()
{
if (IsUIStopInput) return Vector2.zero;
return PlayerInputControl.Player.Look?.ReadValue<Vector2>() ?? Vector2.zero;
}
private void AddEvent()
{
foreach (var actionMap in PlayerInputControl.asset.actionMaps)
{
actionMap.Enable();
if (actionMap.name == "UI")
{
foreach (var action in actionMap.actions)
{
if (action.type == InputActionType.Button)
{
action.performed += OnUIButtonPerformed;
action.canceled += OnUIButtonCanceled;
}
}
}
else if (actionMap.name == "Player")
{
foreach (var action in actionMap.actions)
{
if (action.type == InputActionType.Button)
{
action.performed += OnPlayerButtonPerformed;
action.canceled += OnPlayerButtonCanceled;
}
}
}
}
}
private void RemoveEvent()
{
OnUIPerformed = null;
OnUICanceled = null;
OnPlayerPerformed = null;
OnPlayerCanceled = null;
}
private void OnUIButtonPerformed(InputAction.CallbackContext context)
{
OnUIPerformed?.Invoke(context.action.name);
}
private void OnUIButtonCanceled(InputAction.CallbackContext context)
{
OnUICanceled?.Invoke(context.action.name);
}
private void OnPlayerButtonPerformed(InputAction.CallbackContext context)
{
if (IsUIStopInput) return;
var actionName = context.action.name;
if (actionName == "Op1")
{
OnOp1Action?.Invoke(true);
}
else if (actionName == "Op2")
{
OnOp2Action?.Invoke(true);
}
OnPlayerPerformed?.Invoke(actionName);
}
private void OnPlayerButtonCanceled(InputAction.CallbackContext context)
{
if (IsUIStopInput) return;
var actionName = context.action.name;
if (actionName == "Op1")
{
OnOp1Action?.Invoke(false);
}
else if (actionName == "Op2")
{
OnOp2Action?.Invoke(false);
}
OnPlayerCanceled?.Invoke(actionName);
}
public void OnInteractiveObject(InteractiveObject interactiveObject)
{
Debug.LogError($"OnInteractiveObject {interactiveObject != null}");
OnInteractiveObjectAction?.Invoke(interactiveObject);
}
public void SendUIInput(string actionName)
{
OnUIPerformed?.Invoke(actionName);
OnUICanceled?.Invoke(actionName);
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: fecc50928be248b896f6ee0a17e7b76d
timeCreated: 1746892722

View File

@@ -8,7 +8,7 @@ namespace NBF.Setting
public override string Group => SettingsDef.Group.Keyboard;
public override string Tab => SettingsDef.Tab.Keyboard;
public override InputAction InputAction => InputManager.PlayerInputControl.Player.AddBob;
public override InputAction InputAction => Game.Input.PlayerInputControl.Player.AddBob;
protected override void OnApply()
{

View File

@@ -9,7 +9,7 @@ namespace NBF.Setting
public override string Group => SettingsDef.Group.Keyboard;
public override string Tab => SettingsDef.Tab.Keyboard;
public override InputAction InputAction => InputManager.PlayerInputControl.Player.Chat;
public override InputAction InputAction => Game.Input.PlayerInputControl.Player.Chat;
protected override void OnApply()
{

View File

@@ -8,7 +8,7 @@ namespace NBF.Setting
public override string Group => SettingsDef.Group.Keyboard;
public override string Tab => SettingsDef.Tab.Keyboard;
public override InputAction InputAction => InputManager.PlayerInputControl.Player.Help;
public override InputAction InputAction => Game.Input.PlayerInputControl.Player.Help;
protected override void OnApply()
{

View File

@@ -8,7 +8,7 @@ namespace NBF.Setting
public override string Group => SettingsDef.Group.Keyboard;
public override string Tab => SettingsDef.Tab.Keyboard;
public override InputAction InputAction => InputManager.PlayerInputControl.Player.SubBob;
public override InputAction InputAction => Game.Input.PlayerInputControl.Player.SubBob;
protected override void OnApply()
{

View File

@@ -8,7 +8,7 @@ namespace NBF.Setting
public override string Group => SettingsDef.Group.Keyboard;
public override string Tab => SettingsDef.Tab.Keyboard;
public override InputAction InputAction => InputManager.PlayerInputControl.Player.ToBag;
public override InputAction InputAction => Game.Input.PlayerInputControl.Player.ToBag;
protected override void OnApply()
{

View File

@@ -8,7 +8,7 @@ namespace NBF.Setting
public override string Group => SettingsDef.Group.Keyboard;
public override string Tab => SettingsDef.Tab.Keyboard;
public override InputAction InputAction => InputManager.PlayerInputControl.Player.UseTelescope;
public override InputAction InputAction => Game.Input.PlayerInputControl.Player.UseTelescope;
protected override void OnApply()
{

View File

@@ -8,7 +8,7 @@ namespace NBF.Setting
public override string Group => SettingsDef.Group.Keyboard;
public override string Tab => SettingsDef.Tab.Keyboard;
public override InputAction InputAction => InputManager.PlayerInputControl.Player.UseTorch;
public override InputAction InputAction => Game.Input.PlayerInputControl.Player.UseTorch;
protected override void OnApply()
{

View File

@@ -62,7 +62,7 @@ namespace NBF
Log.Debug($"登录到Gate服务器成功ErrorCode:{loginResponse.ErrorCode}");
await role.GetRoleInfo();
Log.Debug(
$"获取角色信息成功roleId={role.Id} Room={role.RoomId} RoleInfo={JsonConvert.SerializeObject(role.Info)}");
$"获取角色信息成功roleId={role.Id} Room={role.RoomCode} RoleInfo={JsonConvert.SerializeObject(role.Info)}");
var mapId = role.Info.MapId;
if (mapId == 0)
{
@@ -70,7 +70,8 @@ namespace NBF
mapId = 99;
}
await MapHelper.EnterMap(mapId, role.RoomId);
Game.SelfId = loginResponse.RoleId;
await MapHelper.EnterMap(mapId, role.RoomCode);
}
}
}

View File

@@ -17,7 +17,7 @@ namespace NBF.Fishing2
var input = scene.AddComponent<InputComponent>();
scene.AddComponent<SettingComponent>();
Global.Input = input;
Game.Input = input;
}
await FTask.CompletedTask;

View File

@@ -49,7 +49,8 @@ namespace NBF
{
// if (!SRDebug.Instance.IsDebugPanelVisible && !SRDebug.Instance.IsDebugPanelVisible)
{
var lookInput = InputManager.GetLookInput();
// var lookInput = InputManager.GetLookInput();
var lookInput = Vector2.zero;
float num = Mathf.Clamp(lookInput.y * YSensitivity * 5f * Time.deltaTime, -10f, 10f);
float num2 =

View File

@@ -15,7 +15,7 @@ namespace NBF
protected override void OnShow()
{
InputManager.OnUICanceled += OnUICanceled;
Game.Input.OnUICanceled += OnUICanceled;
UseBottomMenu();
}
@@ -49,7 +49,7 @@ namespace NBF
protected override void OnHide()
{
InputManager.OnUICanceled -= OnUICanceled;
Game.Input.OnUICanceled -= OnUICanceled;
}
protected override void OnDestroy()

View File

@@ -18,12 +18,12 @@ namespace NBF
private void OnInited()
{
InputManager.OnUICanceled += OnUICanceled;
Game.Input.OnUICanceled += OnUICanceled;
}
public override void Dispose()
{
InputManager.OnUICanceled -= OnUICanceled;
Game.Input.OnUICanceled -= OnUICanceled;
base.Dispose();
}

View File

@@ -21,7 +21,7 @@ namespace NBF
{
var item = context.data as BtnTitleInputControl;
if (item == null) return;
InputManager.Instance.SendUIInput(item.ActionName);
Game.Input.SendUIInput(item.ActionName);
Debug.Log("模拟点击===");
}

View File

@@ -18,12 +18,12 @@ namespace NBF
BtnPrev.onClick.Add(OnClickBtnPrev);
BtnNext.onClick.Add(OnClickBtnNext);
InputManager.OnUICanceled += OnUICanceled;
Game.Input.OnUICanceled += OnUICanceled;
}
public override void Dispose()
{
InputManager.OnUICanceled -= OnUICanceled;
Game.Input.OnUICanceled -= OnUICanceled;
base.Dispose();
}

View File

@@ -18,12 +18,12 @@ namespace NBF
BtnPrev.onClick.Add(OnClickBtnPrev);
BtnNext.onClick.Add(OnClickBtnNext);
InputManager.OnUICanceled += OnUICanceled;
Game.Input.OnUICanceled += OnUICanceled;
}
public override void Dispose()
{
InputManager.OnUICanceled -= OnUICanceled;
Game.Input.OnUICanceled -= OnUICanceled;
base.Dispose();
}

View File

@@ -15,7 +15,7 @@ namespace NBF
protected override void OnShow()
{
InputManager.OnUICanceled += OnUICanceled;
Game.Input.OnUICanceled += OnUICanceled;
}
private void OnUICanceled(string action)
@@ -37,7 +37,7 @@ namespace NBF
protected override void OnHide()
{
InputManager.OnUICanceled -= OnUICanceled;
Game.Input.OnUICanceled -= OnUICanceled;
}
protected override void OnDestroy()

View File

@@ -51,7 +51,7 @@ namespace NBF
HideAnim = this.HideCenterScaleBig;
IsModal = true;
IsDontBack = true;
InputManager.OnUICanceled += OnUICanceled;
Game.Input.OnUICanceled += OnUICanceled;
}
protected override void OnShow()
@@ -80,7 +80,7 @@ namespace NBF
protected override void OnDestroy()
{
base.OnDestroy();
InputManager.OnUICanceled -= OnUICanceled;
Game.Input.OnUICanceled -= OnUICanceled;
}

View File

@@ -16,9 +16,9 @@ namespace NBF
protected override void OnShow()
{
InputManager.OnUICanceled += OnUICanceled;
InputManager.OnInteractiveObjectAction += OnInteractiveObjectAction;
InputManager.OnPlayerCanceled += OnPlayerCanceled;
Game.Input.OnUICanceled += OnUICanceled;
Game.Input.OnInteractiveObjectAction += OnInteractiveObjectAction;
Game.Input.OnPlayerCanceled += OnPlayerCanceled;
// InputManager.OnUseAction += OnUseAction;
// InputManager.OnUse2Action += OnUse2Action;
}
@@ -70,9 +70,9 @@ namespace NBF
protected override void OnHide()
{
base.OnHide();
InputManager.OnUICanceled -= OnUICanceled;
InputManager.OnInteractiveObjectAction -= OnInteractiveObjectAction;
InputManager.OnUICanceled -= OnPlayerCanceled;
Game.Input.OnUICanceled -= OnUICanceled;
Game.Input.OnInteractiveObjectAction -= OnInteractiveObjectAction;
Game.Input.OnUICanceled -= OnPlayerCanceled;
}
}
}

View File

@@ -29,7 +29,7 @@ namespace NBF
protected override void OnShow()
{
InputManager.OnUICanceled += OnUICanceled;
Game.Input.OnUICanceled += OnUICanceled;
UseBottomMenu();
@@ -40,7 +40,7 @@ namespace NBF
protected override void OnHide()
{
InputManager.OnUICanceled -= OnUICanceled;
Game.Input.OnUICanceled -= OnUICanceled;
}
private void OnUICanceled(string action)

View File

@@ -5,6 +5,7 @@ using UnityEngine;
using NBC;
using NBC.Entitas;
using NBF.Fishing2;
using UnityEngine.InputSystem;
using UIPanel = NBC.UIPanel;
namespace NBF
@@ -14,6 +15,54 @@ namespace NBF
protected override void OnInit()
{
this.AutoAddClick(OnClick);
Game.Input.OnPlayerPerformed += OnPlayerCanceled;
Game.Input.OnPlayerPerformed += OnPlayerPerformed;
Game.Input.OnPlayerValueCanceled += OnPlayerValueCanceled;
Game.Input.OnPlayerValuePerformed += OnPlayerValuePerformed;
}
private bool _isRun;
private void OnPlayerPerformed(string action)
{
if (action == "Run")
{
_isRun = true;
}
Log.Info($"OnPlayerPerformed action = {action}");
}
private void OnPlayerCanceled(string action)
{
if (action == "Run")
{
_isRun = false;
}
Log.Info($"OnPlayerCanceled action = {action}");
}
private void OnPlayerValueCanceled(InputAction.CallbackContext context)
{
var name = context.action.name;
if (name == "Move")
{
var v2 = context.ReadValue<Vector2>();
Log.Info($"OnPlayerValueCanceled name={name} v2={v2}");
}
}
private void OnPlayerValuePerformed(InputAction.CallbackContext context)
{
var name = context.action.name;
if (name == "Move")
{
var v2 = context.ReadValue<Vector2>();
Log.Info($"OnPlayerValuePerformed name={name} v2={v2}");
}
}
private void OnClick(GComponent btn)

View File

@@ -43,7 +43,7 @@ namespace NBF
protected override void OnShow()
{
Settings.Instance.LoadAllSettings();
InputManager.OnUICanceled += OnUICanceled;
Game.Input.OnUICanceled += OnUICanceled;
Menu.SetTabs(tabList);
UseBottomMenu();
}
@@ -271,7 +271,7 @@ namespace NBF
protected override void OnHide()
{
base.OnHide();
InputManager.OnUICanceled -= OnUICanceled;
Game.Input.OnUICanceled -= OnUICanceled;
}
protected override void OnDestroy()

View File

@@ -53,6 +53,7 @@ MonoBehaviour:
m_AdditionalLightsShadowResolutionTierHigh: 1024
m_ReflectionProbeBlending: 1
m_ReflectionProbeBoxProjection: 1
m_ReflectionProbeAtlas: 1
m_ShadowDistance: 150
m_ShadowCascadeCount: 4
m_Cascade2Split: 0.25
@@ -129,6 +130,10 @@ MonoBehaviour:
m_PrefilterScreenCoord: 1
m_PrefilterNativeRenderPass: 1
m_PrefilterUseLegacyLightmaps: 0
m_PrefilterBicubicLightmapSampling: 1
m_PrefilterReflectionProbeBlending: 0
m_PrefilterReflectionProbeBoxProjection: 0
m_PrefilterReflectionProbeAtlas: 0
m_ShaderVariantLogLevel: 0
m_ShadowCascades: 0
m_Textures:

View File

@@ -63,7 +63,21 @@ MonoBehaviour:
- rid: 6565977368940511236
- rid: 6565977368940511237
m_RuntimeSettings:
m_List: []
m_List:
- rid: 6852985685364965378
- rid: 6852985685364965379
- rid: 6852985685364965380
- rid: 6852985685364965381
- rid: 6852985685364965384
- rid: 6852985685364965385
- rid: 6852985685364965392
- rid: 6852985685364965394
- rid: 8712630790384254976
- rid: 7166519162571063296
- rid: 7166519162571063298
- rid: 7166519162571063301
- rid: 6565977368940511236
- rid: 6565977368940511237
m_AssetVersion: 8
m_ObsoleteDefaultVolumeProfile: {fileID: 0}
m_RenderingLayerNames:

View File

@@ -281,7 +281,7 @@ Texture2D:
serializedVersion: 2
Hash: 00000000000000000000000000000000
m_IsAlphaChannelOptional: 0
serializedVersion: 3
serializedVersion: 4
m_Width: 1
m_Height: 1
m_CompleteImageSize: 1

View File

@@ -5,6 +5,7 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ABindingFlags_002Ecs_002Fl_003AC_0021_003FUsers_003Fbob_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F5a41d6b7189842eca409fd0b1c3e3dcf17bf78_003Fa8_003F57a4f791_003FBindingFlags_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ABindingFlags_002Ecs_002Fl_003AC_0021_003FUsers_003Fbob_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F9c2967a135e648bdb993c5397a44991b573620_003F94_003F16186629_003FBindingFlags_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACollider_002Ecs_002Fl_003AC_0021_003FUsers_003F60527_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F03ef825315384b1cab81c4b53eb03d922ac00_003Fd1_003Fa6f13559_003FCollider_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AComponent_002Ecs_002Fl_003AC_0021_003FUsers_003F60527_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb4c8c45fec274213bfac03ee0e9a3d621f5a00_003F7b_003F4d79464b_003FComponent_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACursor_002Ecs_002Fl_003AC_0021_003FUsers_003F60527_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F021f30a9a92b48ce98ae6b39956dd76a1df600_003Fd0_003F709b15ec_003FCursor_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADictionary_00602_002Ecs_002Fl_003AC_0021_003FUsers_003F60527_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F3789ee403a53437cbb6b5d9ab6311f51573620_003Fe4_003F91da590a_003FDictionary_00602_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003AC_0021_003FUsers_003F60527_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F314938d17f3848e8ac683e11b27f62ee46ae00_003F70_003F17d560d4_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>

View File

@@ -106,7 +106,7 @@ PlayerSettings:
xboxEnableFitness: 0
visibleInBackground: 1
allowFullscreenSwitch: 1
fullscreenMode: 1
fullscreenMode: 3
xboxSpeechDB: 0
xboxEnableHeadOrientation: 0
xboxEnableGuest: 0
@@ -142,7 +142,8 @@ PlayerSettings:
visionOSBundleVersion: 1.0
tvOSBundleVersion: 1.0
bundleVersion: 0.1.0
preloadedAssets: []
preloadedAssets:
- {fileID: -944628639613478452, guid: 8a314d59348c97b4e96e6eb9b09285a6, type: 3}
metroInputSource: 0
wsaTransparentSwapchain: 0
m_HolographicPauseOnTrackingLoss: 1
@@ -520,7 +521,10 @@ PlayerSettings:
m_Height: 720
m_Kind: 1
m_SubKind:
m_BuildTargetBatching: []
m_BuildTargetBatching:
- m_BuildTarget: Standalone
m_StaticBatching: 1
m_DynamicBatching: 0
m_BuildTargetShaderSettings: []
m_BuildTargetGraphicsJobs: []
m_BuildTargetGraphicsJobMode: []