您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
172 行
6.7 KiB
172 行
6.7 KiB
using Unity.Entities;
|
|
using UnityEngine;
|
|
|
|
[DisableAutoCreation]
|
|
public class HandleDamage : BaseComponentSystem<HealthState,HitCollisionOwner>
|
|
{
|
|
public HandleDamage(GameWorld gameWorld) : base(gameWorld)
|
|
{}
|
|
|
|
protected override void Update(Entity entity, HealthState healthState, HitCollisionOwner hitCollisionOwner)
|
|
{
|
|
if (healthState.health <= 0)
|
|
return;
|
|
|
|
var isDamaged = false;
|
|
var impulseVec = Vector3.zero;
|
|
var damage = 0.0f;
|
|
var damageVec = Vector3.zero;
|
|
|
|
|
|
// Apply hitcollider damage events
|
|
var damageEvents = hitCollisionOwner.damageEvents;
|
|
for (var eventIndex=0;eventIndex < damageEvents.Count; eventIndex++)
|
|
{
|
|
isDamaged = true;
|
|
|
|
var damageEvent = damageEvents[eventIndex];
|
|
|
|
//GameDebug.Log(string.Format("ApplyDamage. Target:{0} Instigator:{1} Dam:{2}", healthState.name, m_world.GetGameObjectFromEntity(damageEvent.instigator), damageEvent.damage ));
|
|
healthState.ApplyDamage(ref damageEvent, m_world.worldTime.tick);
|
|
|
|
impulseVec += damageEvent.direction * damageEvent.impulse;
|
|
damageVec += damageEvent.direction * damageEvent.damage;
|
|
damage += damageEvent.damage;
|
|
|
|
//damageHistory.ApplyDamage(ref damageEvent, m_world.worldTime.tick);
|
|
|
|
if (damageEvents[eventIndex].instigator != Entity.Null && EntityManager.Exists(damageEvent.instigator) && EntityManager.HasComponent<DamageHistory>(damageEvent.instigator))
|
|
{
|
|
var instigatorDamageHistory = EntityManager.GetComponentObject<DamageHistory>(damageEvent.instigator);
|
|
if (m_world.worldTime.tick > instigatorDamageHistory.inflictedDamage.tick)
|
|
{
|
|
instigatorDamageHistory.inflictedDamage.tick = m_world.worldTime.tick;
|
|
instigatorDamageHistory.inflictedDamage.lethal = false;
|
|
}
|
|
instigatorDamageHistory.inflictedDamage.lethal |= healthState.health <= 0;
|
|
}
|
|
|
|
hitCollisionOwner.collisionEnabled = healthState.health > 0;
|
|
}
|
|
hitCollisionOwner.damageEvents.Clear();
|
|
|
|
if (isDamaged)
|
|
{
|
|
var charPredictedState = EntityManager.GetComponentObject<CharacterPredictedState>(entity);
|
|
var damageImpulse = impulseVec.magnitude;
|
|
var damageDir = damageImpulse > 0 ? impulseVec.normalized : damageVec.normalized;
|
|
charPredictedState.State.damageTick = m_world.worldTime.tick;
|
|
charPredictedState.State.damageDirection = damageDir;
|
|
charPredictedState.State.damageImpulse = damageImpulse;
|
|
|
|
|
|
if (healthState.health <= 0)
|
|
{
|
|
var ragdollState = EntityManager.GetComponentObject<RagdollState>(entity);
|
|
ragdollState.ragdollActive = true;
|
|
ragdollState.impulse = impulseVec;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public class CharacterModuleServer : CharacterModuleShared
|
|
{
|
|
public CharacterModuleServer(GameWorld world, BundledResourceManager resourceSystem): base(world)
|
|
{
|
|
// Handle spawn requests
|
|
m_HandleCharacterSpawnRequests = m_world.GetECSWorld().CreateManager<HandleCharacterSpawnRequests>(m_world, resourceSystem, true);
|
|
m_HandleCharacterDespawnRequests = m_world.GetECSWorld().CreateManager<HandleCharacterDespawnRequests>(m_world);
|
|
|
|
// Handle controlled entity changed
|
|
CharacterBehaviours.CreateControlledEntityChangedSystems(m_world, m_ControlledEntityChangedSystems);
|
|
m_ControlledEntityChangedSystems.Add(m_world.GetECSWorld().CreateManager<PlayerCharacterControlSystem>(m_world));
|
|
|
|
// Handle spawn
|
|
CharacterBehaviours.CreateHandleSpawnSystems(m_world, m_HandleSpawnSystems, resourceSystem);
|
|
|
|
// Handle despawn
|
|
CharacterBehaviours.CreateHandleDespawnSystems(m_world, m_HandleSpawnSystems);
|
|
|
|
// Movement
|
|
m_MovementStartSystems.Add(m_world.GetECSWorld().CreateManager<UpdateTeleportation>(m_world));
|
|
CharacterBehaviours.CreateMovementStartSystems(m_world,m_MovementStartSystems);
|
|
CharacterBehaviours.CreateMovementResolveSystems(m_world,m_MovementResolveSystems);
|
|
|
|
// Ability
|
|
CharacterBehaviours.CreateAbilityStartSystems(m_world,m_AbilityStartSystems);
|
|
CharacterBehaviours.CreateAbilityResolveSystems(m_world,m_AbilityResolveSystems);
|
|
|
|
|
|
|
|
m_UpdateCharPresentationState = m_world.GetECSWorld().CreateManager<UpdateCharPresentationState>(m_world);
|
|
m_ApplyPresentationStateToCharacters = m_world.GetECSWorld().CreateManager<ApplyPresentationStateToCharacters>(m_world);
|
|
m_ApplyPresentationStateToItems = m_world.GetECSWorld().CreateManager<ApplyPresentationStateToItems>(m_world);
|
|
|
|
|
|
m_HandleDamage = m_world.GetECSWorld().CreateManager<HandleDamage>(m_world);
|
|
m_characterItemLateUpdate = m_world.GetECSWorld().CreateManager<CharacterItemLateUpdate>(m_world);
|
|
}
|
|
|
|
public override void Shutdown()
|
|
{
|
|
base.Shutdown();
|
|
|
|
m_world.GetECSWorld().DestroyManager(m_HandleCharacterDespawnRequests);
|
|
|
|
m_world.GetECSWorld().DestroyManager(m_UpdateCharPresentationState);
|
|
|
|
m_world.GetECSWorld().DestroyManager(m_HandleDamage);
|
|
m_world.GetECSWorld().DestroyManager(m_characterItemLateUpdate);
|
|
m_world.GetECSWorld().DestroyManager(m_ApplyPresentationStateToCharacters);
|
|
m_world.GetECSWorld().DestroyManager(m_ApplyPresentationStateToItems);
|
|
|
|
}
|
|
|
|
public void HandleSpawnRequests()
|
|
{
|
|
m_HandleCharacterDespawnRequests.Update();
|
|
m_HandleCharacterSpawnRequests.Update();
|
|
}
|
|
|
|
public void HandleDamage()
|
|
{
|
|
m_HandleDamage.Update();
|
|
}
|
|
|
|
public void PresentationUpdate()
|
|
{
|
|
m_UpdateCharPresentationState.Update();
|
|
m_ApplyPresentationStateToCharacters.Update();
|
|
m_ApplyPresentationStateToItems.Update();
|
|
}
|
|
|
|
public void AttachmentUpdate()
|
|
{
|
|
m_characterItemLateUpdate.Update();
|
|
}
|
|
|
|
public void CleanupPlayer(PlayerState player)
|
|
{
|
|
if (player.controlledEntity != Entity.Null)
|
|
{
|
|
CharacterDespawnRequest.Create(m_world, player.controlledEntity);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
readonly HandleCharacterSpawnRequests m_HandleCharacterSpawnRequests;
|
|
readonly HandleCharacterDespawnRequests m_HandleCharacterDespawnRequests;
|
|
|
|
readonly UpdateCharPresentationState m_UpdateCharPresentationState;
|
|
readonly ApplyPresentationStateToCharacters m_ApplyPresentationStateToCharacters;
|
|
readonly ApplyPresentationStateToItems m_ApplyPresentationStateToItems;
|
|
|
|
readonly HandleDamage m_HandleDamage;
|
|
|
|
readonly CharacterItemLateUpdate m_characterItemLateUpdate;
|
|
}
|