플레이어 생성 위치 초기화 오류 수정

Instantiate(prefab)만 사용하면 추후에 position을 바꿔도 다시 프리팹의 포지션으로 돌아오는 현상이 내부적으로 존재함.
Instantiate 동시에 매개변수로 position, rotation, parent를 모두 초기화 하는걸 권장함
This commit is contained in:
NTG 2025-08-17 15:02:04 +09:00
parent 76bb92117f
commit 8031f5cfa0
8 changed files with 33 additions and 39 deletions

Binary file not shown.

View File

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 47e757b9a170ab649af14c4d7b80ac41
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

View File

@ -1,31 +1,34 @@
using System.Threading.Tasks;
using UnityEditor;
using UnityEngine;
namespace DDD
{
public class CreateRestaurantPlayer : RestaurantFlowTask
{
[SerializeField]
private Vector3 _spawnPosition;
[SerializeField] private Vector3 _spawnPosition = new(0, 0, 15f);
[SerializeField] private Transform _spawnParent;
private GameObject playerPrefab;
public override async Task ReadyFlowTask()
public override Task ReadyFlowTask()
{
playerPrefab = await AssetManager.LoadAsset<GameObject>(CommonConstants.RestaurantPlayer);
return Task.CompletedTask;
}
public override Task RunFlowTask()
{
// TODO : Player exist check
if (PlayerManager.Instance.GetPlayer() != null)
{
return Task.CompletedTask;
}
var player = PrefabUtility.InstantiatePrefab(playerPrefab) as GameObject;
player.transform.position = _spawnPosition;
player.transform.rotation = playerPrefab.transform.rotation;
player.name = CommonConstants.RestaurantPlayer;
CameraManager.Instance.GetCameraGameObject(CameraType.RestaurantBaseCamera)
.SetFollowAndLookAtTarget(player.transform);
var playerPrefab = RestaurantDataSo.instance.PlayerData.PlayerPrefab;
if (playerPrefab == null)
{
Debug.LogError("PlayerPrefab이 설정되지 않았습니다!");
return Task.CompletedTask;
}
GameObject player = Instantiate(playerPrefab, _spawnPosition, playerPrefab.transform.rotation, _spawnParent);
player.name = playerPrefab.name;
return Task.CompletedTask;
}

View File

@ -30,7 +30,7 @@ public async Task Init()
{
await LoadData();
await RestaurantDataSo.instance.LoadData();
InitializeAllFlowControllers();
await InitializeAllFlowControllers();
}
public void PostInit()
@ -42,7 +42,7 @@ private void RegisterFlowHandler()
GameFlowManager.Instance.FlowHandlers.Add(this);
}
private void InitializeAllFlowControllers()
private async Task InitializeAllFlowControllers()
{
// Create controllers and initialize them
foreach (var restaurantFlowControllerType in RestaurantFlowControllerTypes)
@ -51,12 +51,12 @@ private void InitializeAllFlowControllers()
var newController = ScriptableObject.CreateInstance(restaurantFlowControllerType);
var newFlowController = newController as RestaurantFlowController;
_restaurantFlowControllers.Add(newFlowController);
newFlowController.InitializeController();
await newFlowController.InitializeController();
}
foreach (var restaurantFlowController in _restaurantFlowControllers)
{
restaurantFlowController.InitializeState();
await restaurantFlowController.InitializeState();
}
}

View File

@ -6,6 +6,8 @@ namespace DDD
[CreateAssetMenu(fileName = "RestaurantPlayerDataSo", menuName = "RestaurantData/RestaurantPlayerDataSo")]
public class RestaurantPlayerDataSo : ScriptableObject
{
public GameObject PlayerPrefab;
public bool IsDrawLineDebug = true;
public bool IsMoveEnabled = true;

View File

@ -10,8 +10,8 @@ namespace DDD
public class RestaurantDataSo : ScriptableSingleton<RestaurantDataSo>
{
[Header("Asset References")]
[SerializeField] private AssetReference RestaurantPlayerDataSo;
[SerializeField] private AssetReference RestaurantManagementDataSo;
[SerializeField] private AssetReference _restaurantPlayerDataSo;
[SerializeField] private AssetReference _restaurantManagementDataSo;
public RestaurantPlayerDataSo PlayerData { get; private set; }
public RestaurantManagementDataSo ManagementData { get; private set; }
@ -25,8 +25,8 @@ public async Task LoadData()
return;
}
var playerHandle = RestaurantPlayerDataSo.LoadAssetAsync<RestaurantPlayerDataSo>();
var managementHandle = RestaurantManagementDataSo.LoadAssetAsync<RestaurantManagementDataSo>();
var playerHandle = _restaurantPlayerDataSo.LoadAssetAsync<RestaurantPlayerDataSo>();
var managementHandle = _restaurantManagementDataSo.LoadAssetAsync<RestaurantManagementDataSo>();
await playerHandle.Task;
await managementHandle.Task;
@ -40,8 +40,8 @@ private void OnDisable()
{
if (!_isLoaded) return;
RestaurantPlayerDataSo.ReleaseAsset();
RestaurantManagementDataSo.ReleaseAsset();
_restaurantPlayerDataSo.ReleaseAsset();
_restaurantManagementDataSo.ReleaseAsset();
_isLoaded = false;
}