该项目的目的是同时测试和演示来自 Unity DOTS 技术堆栈的多个新包。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

205 行
8.7 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using Unity.Entities;
using Unity.NetCode;
using UnityEngine;
public class AbilityMelee
{
public enum Phase
{
Idle,
Punch,
Hold,
}
public const Ability.AbilityTagValue Tag = Ability.AbilityTagValue.Melee;
public struct State : IComponentData
{
public int lastHitCheckTick;
public int rayQueryId;
}
[Serializable]
public struct Settings : IComponentData
{
public UserCommand.Button activateButton;
public float damage;
public float damageDist;
public float damageRadius;
public float damageImpulse;
public float impactTime;
public int punchPerSecond;
public Ability.AbilityAction.Action punchAction;
}
public struct PredictedState : IComponentData
{
[GhostDefaultField]
public Phase phase;
[GhostDefaultField]
public int phaseStartTick;
}
public struct InterpolatedState : IComponentData
{
[GhostDefaultField]
public int impactTick;
}
}
//
//[UpdateInGroup(typeof(BehaviourRequestPhase))]
//public class Melee_RequestActive : ComponentSystem
//{
// protected override void OnUpdate()
// {
// Entities.WithAll<AbilityStateIdle>().ForEach((Entity entity, ref EnabledAbility activeAbility,
// ref AbilityControl abilityCtrl, ref AbilityStateIdle stateIdle, ref Ability_Melee.Settings settings) =>
// {
// var command = EntityManager.GetComponentData<PlayerControlled.State>(activeAbility.owner).command;
// stateIdle.requestActive = command.buttons.IsSet(settings.activateButton);
// });
// }
//}
//
//
//[UpdateInGroup(typeof(AbilityUpdatePhase))]
//public class Melee_Update : ComponentSystem
//{
// protected override void OnUpdate()
// {
// // TODO (mogensh) find cleaner way to get time
// var globalTime = GetEntityQuery(ComponentType.ReadOnly<GlobalGameTime>()).GetSingleton<GlobalGameTime>();
// var time = globalTime.gameTime;
//
// Entities.ForEach((Entity entity, ref EnabledAbility activeAbility,
// ref AbilityControl abilityCtrl, ref Ability_Melee.PredictedState predictedState,
// ref Ability_Melee.State localState, ref Ability_Melee.Settings settings) =>
// {
// if (!abilityCtrl.active)
// {
// if (predictedState.phase != Ability_Melee.Phase.Idle)
// predictedState.SetPhase(Ability_Melee.Phase.Idle, time.tick);
// EntityManager.SetComponentData(entity, predictedState);
// return;
// }
//
// switch (predictedState.phase)
// {
// case Ability_Melee.Phase.Idle:
// {
// var charPredictedState = EntityManager.GetComponentData<Character.PredictedData>(activeAbility.owner);
//
// abilityCtrl.behaviorState = AbilityControl.State.Active;
// predictedState.SetPhase(Ability_Melee.Phase.Punch, time.tick);
// charPredictedState.SetAction(settings.punchAction, time.tick);
//
// EntityManager.SetComponentData(entity, abilityCtrl);
// EntityManager.SetComponentData(entity, predictedState);
// EntityManager.SetComponentData(activeAbility.owner, charPredictedState);
//
// break;
// }
// case Ability_Melee.Phase.Punch:
// {
// var phaseDuration = time.DurationSinceTick(predictedState.phaseStartTick);
// if (phaseDuration >= settings.impactTime)
// {
// var charState = EntityManager.GetComponentData<Character.State>(activeAbility.owner);
// var charPredictedState = EntityManager.GetComponentData<Character.PredictedData>(activeAbility.owner);
// var command = EntityManager.GetComponentData<PlayerControlled.State>(activeAbility.owner).command;
// var viewDir = command.lookDir;
// var eyePos = charPredictedState.position + Vector3.up * charState.eyeHeight;
//
// predictedState.SetPhase(Ability_Melee.Phase.Hold, time.tick);
//
// var queryReciever = World.GetExistingSystem<RaySphereQueryReciever>();
// localState.rayQueryId = queryReciever.RegisterQuery(new RaySphereQueryReciever.Query()
// {
// origin = eyePos,
// direction = viewDir,
// distance = settings.damageDist,
// ExcludeOwner = activeAbility.owner,
// hitCollisionTestTick = command.renderTick,
// radius = settings.damageRadius,
// mask = ~0U,
// });
//
// EntityManager.SetComponentData(entity, localState);
// EntityManager.SetComponentData(entity, predictedState);
//
// break;
// }
// break;
// }
// case Ability_Melee.Phase.Hold:
// {
// var holdEndDuration = 1.0f / settings.punchPerSecond - settings.impactTime;
// var phaseDuration = time.DurationSinceTick(predictedState.phaseStartTick);
// if (phaseDuration > holdEndDuration)
// {
// var charPredictedState = EntityManager.GetComponentData<Character.PredictedData>(activeAbility.owner);
//
// abilityCtrl.behaviorState = AbilityControl.State.Idle;
// predictedState.SetPhase(Ability_Melee.Phase.Idle, time.tick);
// charPredictedState.SetAction(Character.PredictedData.Action.None, time.tick);
//
// EntityManager.SetComponentData(entity, abilityCtrl);
// EntityManager.SetComponentData(entity, predictedState);
// EntityManager.SetComponentData(activeAbility.owner, charPredictedState);
//
// break;
// }
//
// break;
// }
// }
// });
// }
//}
//
//[UpdateInGroup(typeof(AbilityResolvePhase))]
//public class Melee_HandleCollision : ComponentSystem
//{
// protected override void OnUpdate()
// {
// // TODO (mogensh) find cleaner way to get time
// var globalTime = GetEntityQuery(ComponentType.ReadOnly<GlobalGameTime>()).GetSingleton<GlobalGameTime>();
// var time = globalTime.gameTime;
//
// Entities.ForEach((Entity entity, ref EnabledAbility activeAbility,
// ref AbilityControl abilityCtrl, ref Ability_Melee.State localState,
// ref Ability_Melee.Settings settings) =>
// {
// if (localState.rayQueryId == -1)
// return;
//
// var queryReciever = World.GetExistingSystem<RaySphereQueryReciever>();
//
// RaySphereQueryReciever.Query query;
// RaySphereQueryReciever.QueryResult queryResult;
// queryReciever.GetResult(localState.rayQueryId, out query, out queryResult);
// localState.rayQueryId = -1;
//
// if (queryResult.hitCollisionOwner != Entity.Null)
// {
// var charAbility = EntityManager.GetComponentData<EnabledAbility>(entity);
//
// var damageEventBuffer = EntityManager.GetBuffer<DamageEvent>(queryResult.hitCollisionOwner);
// DamageEvent.AddEvent(damageEventBuffer, charAbility.owner, settings.damage, query.direction, settings.damageImpulse);
//
// var interpolatedState = EntityManager.GetComponentData<Ability_Melee.InterpolatedState>(entity);
// interpolatedState.impactTick = time.tick;
// PostUpdateCommands.SetComponent(entity, interpolatedState);
// }
//
// EntityManager.SetComponentData(entity, localState);
// });
// }
//}