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

76 行
2.7 KiB

using System.Collections.Generic;
using Unity.Collections;
using Unity.Entities;
using Unity.Jobs;
using Unity.Mathematics;
[DisableAutoCreation]
[AlwaysSynchronizeSystem]
public class TeleporterSystemServer : JobComponentSystem
{
NativeList<Entity> characters;
NativeList<float3> positions;
protected override void OnCreate()
{
characters = new NativeList<Entity>(Allocator.Persistent);
positions = new NativeList<float3>(Allocator.Persistent);
}
protected override void OnDestroy()
{
characters.Dispose();
positions.Dispose();
}
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
inputDeps.Complete();
var globalTime = GetEntityQuery(ComponentType.ReadOnly<GlobalGameTime>()).GetSingleton<GlobalGameTime>();
var na_characters = characters;
var na_positions = positions;
na_characters.Clear();
na_positions.Clear();
Entities
.ForEach((Entity entity, ref Character.Settings charSettings, ref Unity.Transforms.LocalToWorld t) =>
{
na_characters.Add(entity);
na_positions.Add(t.Position);
}).Run();
var characterSettingsFromEntity = GetComponentDataFromEntity<Character.Settings>(false);
var teleporterServerFromEntity = GetComponentDataFromEntity<TeleporterServer>(true);
var teleporterPresentationDataFromEntity = GetComponentDataFromEntity<TeleporterPresentationData>(false);
Entities
.ForEach((Entity entity, ref Unity.Transforms.LocalToWorld lw, ref TeleporterServer teleporter, ref TeleporterPresentationData presentation) =>
{
float3 teleporterPos = teleporter.triggerPos;// lw.Position;
for(int i = 0, c = na_characters.Length; i <c; ++i)
{
if (math.distance(na_positions[i], teleporterPos) > teleporter.triggerDist)
continue;
var character = na_characters[i];
var charSettings = characterSettingsFromEntity[character];
var targetTeleporter = teleporterServerFromEntity[teleporter.targetTeleporter];
Character.TeleportTo(ref charSettings, targetTeleporter.spawnPos, targetTeleporter.spawnRot);
characterSettingsFromEntity[character] = charSettings;
var targetTeleporterPresentation = teleporterPresentationDataFromEntity[teleporter.targetTeleporter];
targetTeleporterPresentation.effectTick = globalTime.gameTime.tick;
teleporterPresentationDataFromEntity[teleporter.targetTeleporter] = targetTeleporterPresentation;
break;
}
}).Run();
return default;
}
}