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 CreatePlayer() { var go = await Addressables.InstantiateAsync(_playerConfig.characterPrefab).ToUniTask(); var provider = go.GetComponent(); 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 CreateArms(Transform papochka) { var armsMesh = (await Addressables.InstantiateAsync(_playerConfig.armsMeshPrefab, papochka).ToUniTask()); GameObjectInjector.InjectRecursive(armsMesh, Container.ProjectContainer); return armsMesh.GetComponent(); } public void ReleaseArms(ArmsMeshProvider arms) => Addressables.ReleaseInstance(arms.gameObject); } }