Net.Like.Xue.Tokyo/Packages-Local/Com.Project.B.Unity/WorldNodeService/UnityEntitiesCreateService.cs

58 lines
2.0 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using BITKit.Entities;
using BITKit.WorldNode;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Project.B.Entities;
using UnityEngine;
namespace Net.Project.B.WorldNode
{
public class UnityEntitiesCreateService:IDisposable
{
private readonly ILogger<UnityEntitiesCreateService> _logger;
private readonly IEntitiesFactory _entitiesFactory;
private readonly IEntitiesService _entitiesService;
public UnityEntitiesCreateService(IEntitiesFactory entitiesFactory, ILogger<UnityEntitiesCreateService> logger, IEntitiesService entitiesService)
{
_entitiesFactory = entitiesFactory;
_logger = logger;
_entitiesService = entitiesService;
_entitiesService.OnAdd += OnNodeRegistered;
}
private async void OnNodeRegistered(IEntity entity)
{
if(entity.ServiceProvider.GetService<UnityEntityFactoryNode>() is not {} entityFactoryNode)return;
if(entityFactoryNode.WorldObject is not GameObject gameObject)return;
var go =await _entitiesFactory.CreateAsync(entityFactoryNode.Address,null);
var transform = go.ServiceProvider.GetRequiredService<Transform>();
if (transform.TryGetComponent<Rigidbody>(out var rigidbody))
{
rigidbody.MovePosition(gameObject.transform.position);
rigidbody.MoveRotation(gameObject.transform.rotation);
}
else
{
transform.SetPositionAndRotation(gameObject.transform.position,gameObject.transform.rotation);
}
_logger.LogDebug($"Entity@{go.Id}:{entityFactoryNode.Address} created");
}
public void Dispose()
{
_entitiesService.OnAdd -= OnNodeRegistered;
}
}
}