Files
CourierOld/Game/CourierOld/Assets/Code/Gameplay/Player/PlayerFactory.cs
T

48 lines
1.7 KiB
C#

using UnityEngine;
using Code.Configs;
using Code.Gameplay.Character.Core;
using Cysharp.Threading.Tasks;
using Reflex.Attributes;
using Reflex.Core;
using Reflex.Extensions;
using Reflex.Injectors;
using UnityEngine.AddressableAssets;
using UnityEngine.SceneManagement;
namespace Code.Gameplay.Player
{
public class PlayerFactory : IPlayerFactory
{
[Inject] PlayerConfig _playerConfig;
[Inject] private IPlayerProvider _playerProvider;
public PlayerHealth CreatePlayerHealth(int count = -1)
{
if (count < 0) count = _playerConfig.maxHealth;
return new(count);
}
public async UniTask<CharacterProvider> CreatePlayer()
{
var go = await Addressables.InstantiateAsync(_playerConfig.characterPrefab).ToUniTask();
var provider = go.GetComponent<CharacterProvider>();
AttributeInjector.Inject(provider, Container.ProjectContainer);
AttributeInjector.Inject(provider.CustomCharacterController, Container.ProjectContainer);
((PlayerProvider)_playerProvider).SetPlayer(provider, _playerConfig);
return provider;
}
public void ReleasePlayer(CharacterProvider characterProvider)
{
((PlayerProvider)_playerProvider).ClearPlayer();
Addressables.ReleaseInstance(characterProvider.gameObject);
}
public async UniTask<ArmsMeshProvider> CreateArms(Transform papochka) => (await Addressables.InstantiateAsync(_playerConfig.armsMeshPrefab, papochka).ToUniTask()).GetComponent<ArmsMeshProvider>();
public void ReleaseArms(ArmsMeshProvider arms) => Addressables.ReleaseInstance(arms.gameObject);
}
}