using System.Threading.Tasks; using UnityEngine; namespace DDD { public interface ICustomerFactory { Task CreateAsync(CustomerSpawnArgs args); } public interface ICustomerInitializer { void Initialize(string customerDataId, CustomerData customerData); } public struct CustomerSpawnArgs { public string CustomerDataId; public CustomerData CustomerData; public Vector3 Position; public Quaternion Rotation; public Transform Parent; } public class CustomerFactory : ICustomerFactory { private GameObject _customerPrefab; public async Task CreateAsync(CustomerSpawnArgs args) { if (!_customerPrefab) { _customerPrefab = await AssetManager.LoadAsset(DataConstants.CustomerNpcPrefab); } var newCustomer = Object.Instantiate(_customerPrefab, args.Position, args.Rotation, args.Parent); if (newCustomer.TryGetComponent(out ICustomerInitializer initializer)) { initializer.Initialize(args.CustomerDataId, args.CustomerData); } return newCustomer; } } }