Окей, то есть для решения задачи нам надо знать три вещи
01) Что следует дать игроку (какой именно префаб)
02) Куда следует его надеть( не на голову же)
03) Откуда следует его брать
Решаем не по очереди
02) Куда?
В руку. Создайте у вашего персонажа в руке пустой объект. Он будет так называемым holder"ом, т.е местом-пустышкой, куда попадёт оружие. Задача усложняется, конечно, если для разного типа оружия есть разная анимация стрельбы или держания оружия, но суть примерно понятна: вам необходимо сделать объект, который будет указывать, куда следует поместить новоиспеченный ствол
03) Каждое оружие должно быть префабом само по себе. Естественно, содержать скрипт стрельбы с нужными настройками. Именно его, этот префаб оружия, мы и будем инстанциировать на месте нашей пустышки
01) Ну тут и так понятно: префаб "вещь" должен иметь информацию о том, какую вещь (для пунка 2) следует добавить игроку.
Итого получаем примерно такой скрипт:
Используется csharp
public GameObject RightArmHolder; // Пункт 2
private void Equip(string holderName, string nameOfPrefab, BaseItem itemToEquip)
{
//Looking for holder from item
GameObject holder = null;
switch (itemToEquip.ItemType) // Код из моего старого проекта. В зависимости от типа оружия мог быть выбран другой holder
{
case ItemType.Weapon:
holder = RightArmHolder;
break;
}
if (holder == null)
{
Debugger.Write(string.Format("Cannot find holder {0}", holderName), LogInfoType.Error);
return;
}
//Удалить оружие, если холдер его уже содержит
if (holder.transform.childCount != 0)
{
var children = (from Transform child in holder.transform select child.gameObject).ToList();
children.ForEach(Destroy);
}
//Достаём префаб оружия
var prefab = Resources.GetResource(nameOfPrefab, itemToEquip.ItemType); // В моем случае, информация бралась из Resources.LoadAll<GameObject>("Weapons");
if (prefab == null)
{
Debug.Log(string.Format("Cannot find prefab {0}", nameOfPrefab));
return;
}
/*
public static GameObject InstanciateAndSetChild(GameObject prefab, Transform holder, Quaternion rotation)
{
var item = Object.Instantiate(prefab, holder.transform.position, Quaternion.Euler(0, 0, 0), holder.transform);
item.transform.localPosition = prefab.transform.position;
item.transform.rotation = rotation;
// item.transform.Rotate(0, 180, 0);
return item;
}
*/
var item = UnityHelper.InstanciateAndSetChild(prefab, holder.transform, Resources.Player.Player.transform.rotation);
var isSuccess = false;
if (itemToEquip.SlotType == InventorySlots.RightArm)
{
}
}
Скрипт Resource