Routine > Check if player is near enemy (CalcalateDistance)
Check if enemy can see player (Raycast)
i used ComponentSystem, not Job. Because cannot use PhysicsWorld in job.
Result : 0.8fps with 300 Entities.
Is my code wrong? Or Unity.physics is slow?
using Unity.Burst;
using Unity.Collections;
using Unity.Entities;
using Unity.Jobs;
using Unity.Mathematics;
using Unity.Transforms;
using Unity.Physics;
using Unity.Physics.Extensions;
using Unity.Physics.Systems;
using Unity.Physics.Authoring;
using System;
public class FollowNearSystem : ComponentSystem
{
public EntityQuery m_Follower;
EntityCommandBufferSystem m_ECB;
public PointDistanceInput pointDistanceInput;
public RaycastInput raycastInput;
public BuildPhysicsWorld phyWorld;
EntityManager em;
public NativeList<DistanceHit> DistanceHits;
public ComponentDataFromEntity<Tag> tag;
protected override void OnCreateManager()
{
m_ECB = World.GetOrCreateSystem<EntityCommandBufferSystem>();
em = World.EntityManager;
m_Follower = GetEntityQuery(
typeof(FollowNear)
);
phyWorld = World.Active.GetOrCreateSystem<BuildPhysicsWorld>();
DistanceHits = new NativeList<DistanceHit>(Allocator.Persistent);
}
unsafe protected override void OnUpdate()
{
DistanceHits.Clear();
Entities.ForEach((Entity entity,
ref FollowNear followNear,
ref CircleCollision collision,
ref Translation translation,
ref Rotation rotation
)
=>
{
pointDistanceInput = new PointDistanceInput
{
Position = translation.Value,
MaxDistance = 10,
Filter = GameSettings._instance.filter((1 << 1), 1 << 0, 0)
};
bool isTargetInDistance = phyWorld.PhysicsWorld.CalculateDistance(pointDistanceInput, out DistanceHit distHit);
raycastInput = new RaycastInput
{
Ray = new Ray(translation.Value, -distHit.SurfaceNormal),
Filter = GameSettings._instance.filter(GameSettings._instance.layer_enemy,
GameSettings._instance.layer_player | GameSettings._instance.layer_structure,
0)
};
bool isTargetInSight = phyWorld.PhysicsWorld.CastRay(raycastInput, out RaycastHit sightHit);
Entity e_sight = phyWorld.PhysicsWorld.Bodies[sightHit.RigidBodyIndex].Entity;
bool isPlayer =
phyWorld.PhysicsWorld.GetCollisionFilter(sightHit.RigidBodyIndex).MaskBits == GameSettings._instance.layer_player ? true : false;
if (isTargetInDistance)
{
DistanceHits.Add(distHit);
if (isPlayer)
{
Entity e_dist = phyWorld.PhysicsWorld.Bodies[distHit.RigidBodyIndex].Entity;
translation = new Translation { Value = translation.Value - (distHit.SurfaceNormal * 0.5f * UnityEngine.Time.deltaTime) };
}
}
});
}
protected override void OnDestroy()
{
if (DistanceHits.IsCreated)
{
DistanceHits.Dispose();
}
}
}