您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
206 行
8.7 KiB
206 行
8.7 KiB
using System.Collections.Generic;
|
|
using Unity.Collections;
|
|
using UnityEngine;
|
|
using Unity.Entities;
|
|
using Unity.Jobs;
|
|
using Unity.Mathematics;
|
|
using Unity.Sample.Core;
|
|
using UnityEditor;
|
|
|
|
|
|
|
|
|
|
public partial class LocalPlayerCharacterControl : MonoBehaviour, IConvertGameObjectToEntity
|
|
{
|
|
public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
|
|
{
|
|
dstManager.AddComponentData(entity,new State());
|
|
dstManager.AddBuffer<AbilityUIElement>(entity);
|
|
dstManager.AddBuffer<PresentationElement>(entity);
|
|
}
|
|
}
|
|
|
|
public partial class LocalPlayerCharacterControl
|
|
{
|
|
[ConfigVar(Name = "char.showhistory", DefaultValue = "0", Description = "Show last char loco states")]
|
|
public static ConfigVar ShowHistory;
|
|
|
|
|
|
public struct State : IComponentData
|
|
{
|
|
public Entity lastRegisteredControlledEntity;
|
|
|
|
public Entity healthUI;
|
|
|
|
public int lastDamageInflictedTick;
|
|
public int lastDamageReceivedTick;
|
|
}
|
|
|
|
public struct AbilityUIElement : IBufferElementData
|
|
{
|
|
public Entity entity;
|
|
}
|
|
|
|
public struct PresentationElement : IBufferElementData
|
|
{
|
|
public Entity entity;
|
|
}
|
|
|
|
[DisableAutoCreation]
|
|
[UpdateInGroup(typeof(ClientLateUpdateGroup))]
|
|
[AlwaysSynchronizeSystem]
|
|
public class UpdateCharacterCamera : JobComponentSystem
|
|
{
|
|
private const float k_default3PDist = 3f; // 1.6
|
|
private float camDist3P = k_default3PDist;
|
|
|
|
bool aimZoom = false;
|
|
|
|
protected override JobHandle OnUpdate(JobHandle inputDeps)
|
|
{
|
|
inputDeps.Complete();
|
|
|
|
var time = GetEntityQuery(ComponentType.ReadOnly<GlobalGameTime>()).GetSingleton<GlobalGameTime>().gameTime;
|
|
var controlledEntityVar = controlledEntity;
|
|
var camDist3PVar = camDist3P;
|
|
var aimZoomVar = aimZoom;
|
|
var configFovValue = 60; // Game.configFov.FloatValue;
|
|
var mouseScrollWheel = Input.GetAxis("Mouse ScrollWheel");
|
|
var characterPredictedDataFromEntity = GetComponentDataFromEntity<Character.PredictedData>(true);
|
|
var characterStateFromEntity = GetComponentDataFromEntity<Character.State>(true);
|
|
var abilityOwnerAimDataFromEntity = GetComponentDataFromEntity<AimData.Data>(true);
|
|
var characterInterpolatedDataFromEntity = GetComponentDataFromEntity<Character.InterpolatedData>(true);
|
|
var playerControlledStateFromEntity = GetComponentDataFromEntity<PlayerControlled.State>(true);
|
|
|
|
Entities
|
|
.ForEach((Entity entity, ref LocalPlayer localPlayer, ref PlayerCameraControl.State cameraSettings, ref State characterControl) =>
|
|
{
|
|
if (localPlayer.controlledEntity == Entity.Null || !characterPredictedDataFromEntity.HasComponent(localPlayer.controlledEntity))
|
|
{
|
|
controlledEntityVar = Entity.Null;
|
|
return;
|
|
}
|
|
|
|
var charState = characterStateFromEntity[localPlayer.controlledEntity];
|
|
|
|
var aimData = abilityOwnerAimDataFromEntity[localPlayer.controlledEntity];
|
|
|
|
var animState = characterInterpolatedDataFromEntity[localPlayer.controlledEntity];
|
|
|
|
// Check if this is first time update is called with this controlled entity
|
|
var characterChanged = localPlayer.controlledEntity != controlledEntityVar;
|
|
if (characterChanged)
|
|
{
|
|
controlledEntityVar = localPlayer.controlledEntity;
|
|
}
|
|
|
|
// Update character visibility
|
|
var camProfile = CameraProfile.ThirdPerson; // charPredictedState.cameraProfile;
|
|
|
|
// Update camera settings
|
|
var userCommand = playerControlledStateFromEntity[localPlayer.controlledEntity];
|
|
var lookRotation = userCommand.command.LookRotation;
|
|
|
|
cameraSettings.isEnabled = 1;
|
|
|
|
// Update FOV
|
|
if (characterChanged)
|
|
cameraSettings.fieldOfView = configFovValue;
|
|
//
|
|
|
|
var targetFOV = animState.sprinting ? charState.sprintCameraSettings.FOVFactor * configFovValue : configFovValue;
|
|
var speed = targetFOV > cameraSettings.fieldOfView ? charState.sprintCameraSettings.FOVInceraetSpeed : charState.sprintCameraSettings.FOVDecreaseSpeed;
|
|
cameraSettings.fieldOfView = Mathf.MoveTowards(cameraSettings.fieldOfView, targetFOV, speed);
|
|
|
|
switch (camProfile)
|
|
{
|
|
case CameraProfile.FirstPerson:
|
|
{
|
|
// var eyePos = charPredictedState.position + Vector3.up * charState.eyeHeight;
|
|
//
|
|
// // Set camera position and adjust 1P char. As 1P char is scaled down we need to "up-scale" camera
|
|
// // animation to world space. We dont want to upscale cam transform relative to 1PChar so we adjust
|
|
// // position accordingly
|
|
// var camLocalOffset = character1P.cameraTransform.position - character1P.transform.position;
|
|
// var cameraRotationOffset = Quaternion.Inverse(character1P.transform.rotation) * character1P.cameraTransform.rotation;
|
|
// var camWorldOffset = camLocalOffset / character1P.transform.localScale.x;
|
|
// var camWorldPos = eyePos + camWorldOffset;
|
|
// var charWorldPos = camWorldPos - camLocalOffset;
|
|
//
|
|
// cameraSettings.position = camWorldPos;
|
|
// cameraSettings.rotation = userCommand.command.lookRotation * cameraRotationOffset;
|
|
//
|
|
// var char1PPresentation = EntityManager.GetComponentObject<CharacterPresentationSetup>(characterControl.firstPerson.char1P);
|
|
// char1PPresentation.transform.position = charWorldPos;
|
|
// char1PPresentation.transform.rotation = userCommand.command.lookRotation;
|
|
|
|
break;
|
|
}
|
|
|
|
case CameraProfile.Shoulder:
|
|
case CameraProfile.ThirdPerson:
|
|
{
|
|
#if UNITY_EDITOR
|
|
if (mouseScrollWheel > 0)
|
|
{
|
|
camDist3PVar -= 0.2f;
|
|
}
|
|
if (mouseScrollWheel < 0)
|
|
{
|
|
camDist3PVar += 0.2f;
|
|
}
|
|
|
|
|
|
aimZoomVar = userCommand.command.buttons.IsSet(UserCommand.Button.Ability2);
|
|
|
|
#endif
|
|
|
|
cameraSettings.position = aimData.CameraAxisPos;
|
|
|
|
cameraSettings.rotation = lookRotation;
|
|
|
|
// Simple offset of camera for better 3rd person view. This is only for animation debug atm
|
|
var viewDir = cameraSettings.rotation * Vector3.forward;
|
|
|
|
if (aimZoomVar)
|
|
{
|
|
cameraSettings.position += -camDist3PVar * 0.5f * viewDir;
|
|
}
|
|
else
|
|
{
|
|
var zoom = 1f;
|
|
if (userCommand.command.lookPitch > 90f)
|
|
{
|
|
zoom = math.remap(90f, 180f, 1f, 0.1f, userCommand.command.lookPitch);
|
|
}
|
|
|
|
cameraSettings.position += -camDist3PVar * zoom * viewDir;
|
|
}
|
|
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
// // TODO (mogensh) find better place to put this.
|
|
// if (LocalPlayerCharacterControl.ShowHistory.IntValue > 0)
|
|
// {
|
|
// charState.ShowHistory(time.tick);
|
|
// }
|
|
}).Run();
|
|
|
|
controlledEntity = controlledEntityVar;
|
|
camDist3P = camDist3PVar;
|
|
aimZoom = aimZoomVar;
|
|
|
|
return default;
|
|
}
|
|
|
|
Entity controlledEntity;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|