您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
136 行
4.1 KiB
136 行
4.1 KiB
using Unity.Entities;
|
|
using UnityEngine;
|
|
|
|
public class SpectatorCam : MonoBehaviour, INetworkSerializable
|
|
{
|
|
public Vector3 position;
|
|
public Quaternion rotation;
|
|
|
|
|
|
public void Serialize(ref NetworkWriter writer, IEntityReferenceSerializer refSerializer)
|
|
{
|
|
writer.WriteVector3Q("pos",position,1);
|
|
writer.WriteQuaternionQ("rot",rotation,1);
|
|
}
|
|
|
|
public void Deserialize(ref NetworkReader reader, IEntityReferenceSerializer refSerializer, int tick)
|
|
{
|
|
position = reader.ReadVector3Q();
|
|
rotation = reader.ReadQuaternionQ();
|
|
}
|
|
}
|
|
|
|
public struct SpectatorCamSpawnRequest : IComponentData
|
|
{
|
|
public Entity playerEntity;
|
|
public Vector3 position;
|
|
public Quaternion rotation;
|
|
|
|
public static void Create(EntityCommandBuffer commandBuffer, Vector3 position, Quaternion rotation, Entity playerEntity)
|
|
{
|
|
var data = new SpectatorCamSpawnRequest()
|
|
{
|
|
playerEntity = playerEntity,
|
|
position = position,
|
|
rotation = rotation,
|
|
};
|
|
commandBuffer.CreateEntity();
|
|
commandBuffer.AddComponent(data);
|
|
}
|
|
}
|
|
|
|
[DisableAutoCreation]
|
|
public class UpdateSpectatorCam : BaseComponentSystem
|
|
{
|
|
struct GroupType
|
|
{
|
|
public ComponentArray<UserCommandComponent> userCommands;
|
|
public ComponentArray<SpectatorCam> spectatorCams;
|
|
}
|
|
|
|
[Inject]
|
|
GroupType Group;
|
|
|
|
public UpdateSpectatorCam(GameWorld world) : base(world)
|
|
{
|
|
}
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
for (var i = 0; i < Group.spectatorCams.Length; i++)
|
|
{
|
|
var command = Group.userCommands[i].command;
|
|
var spectatorCam = Group.spectatorCams[i];
|
|
|
|
spectatorCam.rotation = Quaternion.Euler(new Vector3(90 - command.lookPitch, command.lookYaw, 0));
|
|
|
|
var forward = spectatorCam.rotation * Vector3.forward;
|
|
var right = spectatorCam.rotation * Vector3.right;
|
|
var maxVel = 3 * m_world.worldTime.tickInterval;
|
|
var moveDir = forward * Mathf.Cos(command.moveYaw*Mathf.Deg2Rad) + right * Mathf.Sin(command.moveYaw*Mathf.Deg2Rad);
|
|
spectatorCam.position += moveDir * maxVel * command.moveMagnitude;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
[DisableAutoCreation]
|
|
public class HandleSpectatorCamRequests : BaseComponentSystem
|
|
{
|
|
public struct SpawnRequests
|
|
{
|
|
public EntityArray entities;
|
|
public ComponentDataArray<SpectatorCamSpawnRequest> requests;
|
|
}
|
|
|
|
[Inject]
|
|
public SpawnRequests SpawnGroup;
|
|
|
|
|
|
public HandleSpectatorCamRequests(GameWorld world, BundledResourceManager resourceManager) : base(world)
|
|
{
|
|
m_ResourceManager = resourceManager;
|
|
m_Settings = Resources.Load<SpectatorCamSettings>("SpectatorCamSettings");
|
|
}
|
|
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
if (SpawnGroup.requests.Length == 0)
|
|
return;
|
|
|
|
// Copy requests as spawning will invalidate Group
|
|
var spawnRequests = new SpectatorCamSpawnRequest[SpawnGroup.requests.Length];
|
|
for (var i = 0; i < SpawnGroup.requests.Length; i++)
|
|
{
|
|
spawnRequests[i] = SpawnGroup.requests[i];
|
|
PostUpdateCommands.DestroyEntity(SpawnGroup.entities[i]);
|
|
}
|
|
|
|
for(var i =0;i<spawnRequests.Length;i++)
|
|
{
|
|
var request = spawnRequests[i];
|
|
var playerState = EntityManager.GetComponentObject<PlayerState>(request.playerEntity);
|
|
|
|
|
|
|
|
var resource = m_ResourceManager.LoadSingleAssetResource(m_Settings.spectatorCamPrefab.guid);
|
|
|
|
GameDebug.Assert(resource != null);
|
|
|
|
|
|
var prefab = (GameObject)resource;
|
|
GameDebug.Log("Spawning spectatorcam");
|
|
var spectatorCam = m_world.Spawn<SpectatorCam>(prefab);
|
|
spectatorCam.name = prefab.name;
|
|
spectatorCam.position = request.position;
|
|
spectatorCam.rotation = request.rotation;
|
|
|
|
playerState.controlledEntity = spectatorCam.gameObject.GetComponent<GameObjectEntity>().Entity;
|
|
}
|
|
}
|
|
|
|
readonly SpectatorCamSettings m_Settings;
|
|
readonly BundledResourceManager m_ResourceManager;
|
|
}
|
|
|