Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для компьютеров > Unity > Уроки

Ответ
 
Опции темы
Старый 12.09.2010, 11:38   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,503
Написано 2,958 полезных сообщений
(для 5,224 пользователей)
Инвентарь

У меня нет много времени, чтобы собрать демку, но одну из возможных реализаций инвентаря я смогу показать.

Инвентарь - это набор объектов, содержащих в себе информацию, которую можно использовать в разных местах. Например - название вещи, ссылка на текстуру для отображения в инвентаре, ссылку на префаб для выброса в сцену, ссылку на префаб для одевания и т.д. Все возможные данные, которые необходимы в игре я охватить не могу, так что ограничимся вышеперечисленными.

И начнем мы сразу с кода:
InventoryItem.cs
using UnityEngine;

// элемент инвентаря
public class InventoryItem MonoBehaviour
{
    
// название вещи
    
public string itemName;
    
// текстура для инвентаря
    
public Texture2D inventoryTexture;
    
// префаб для сброса вещи
    
public GameObject prefabToDrop;
    
// префаб для одевания
    
public GameObject prefabToEquip;


SceneItem.cs
using UnityEngine;

// объект сцены, который можно подобрать
public class SceneItem MonoBehaviour
{
    
// префаб для инвентаря
    
public InventoryItem prefab;


    
// если кто-то вошел в триггер, то просим его поднять вещь
    
public void OnTriggerEnter(Collider other)
    {
        
other.gameObject.SendMessage("Equip"this);
    }


Inventory.cs
using System.Collections.Generic;
using UnityEngine;


// инвентарь
public class Inventory MonoBehaviour
{
    
// вещи инвентаря
    
public List<InventoryItemitems = new List<InventoryItem>();
    
// надетые вещи
    
public List<InventoryItemequipped = new List<InventoryItem>();
    
// отображать ли инвентарь
    
public bool showInventory;

    
// вспомогательные переменные
    
private Vector2 _inventoryScroll;
    private 
InventoryItem _itemToDrop null;
    private 
InventoryItem _itemToEquip null;

    public 
void Update()
    {
        
// если нужно выбросить вещь
        
if(_itemToDrop!=null)
        {
            
// удаляем вещь из инвентаря
            
items.Remove(_itemToDrop);
            
// создаем в сцене эту вещь на месте, где стоит игрок
            
Instantiate(_itemToDrop.prefabToDroptransform.positiontransform.rotation);
            
_itemToDrop null;
        }

        
// если нужно одеть
        
if (_itemToEquip != null)
        {
            
// удаляем вещь из инвентаря
            
items.Remove(_itemToEquip);
            
// добавляем ее к одетым вещам
            
equipped.Add(_itemToEquip);
            
// создаем у игрока эту вещь
            
GameObject itemGameObject= (GameObject)Instantiate(_itemToEquip.prefabToEquip);
            
// так как игрок одел вещь, то она является его чайлдом
            
itemGameObject.transform.parent transform;
            
_itemToEquip null;
        }
    }

    
// отображение инвентаря
    
public void OnGUI()
    {
        if (
showInventory)
        {
            if(
GUI.Button(new Rect(101015025), "Hide Inventory"))
            {
                
showInventory = !showInventory;
            }

            
GUILayout.BeginArea(new Rect(Screen.width-20010190Screen.height-20), GUI.skin.box);
            {
                
_inventoryScroll GUILayout.BeginScrollView(_inventoryScrollGUILayout.ExpandHeight(true),GUILayout.ExpandWidth(true));

                
// рисуем каждую вещь инвентаря
                
foreach (InventoryItem item in items)
                {
                    
GUILayout.BeginVertical(GUI.skin.box);
                    
GUILayout.Label(item.itemName); // Название
                    
GUILayout.BeginHorizontal();
                    
GUILayout.Label(item.inventoryTexture); // Иконка
                    
GUILayout.BeginVertical();
                    if (
GUILayout.Button("Equip"))  // Кнопка "надеть"
                    
{
                        
_itemToEquip item;
                    }
                    if (
GUILayout.Button("Drop"))  // Кнопка "бросить"
                    
{
                        
_itemToDrop item;
                    }
                    
GUILayout.EndVertical();
                    
GUILayout.EndHorizontal();
                    
GUILayout.EndVertical();
                }


                
GUILayout.EndScrollView();
            }
            
GUILayout.EndArea();

        }
            
        else
        {
            if (
GUI.Button(new Rect(101015025), "Show Inventory")) 
            {
                
showInventory = !showInventory;
            }
        }
    }


    
// подбор вещи
    
public void Equip(object item)
    {
        
SceneItem sceneItem = (SceneItemitem;

        if (
sceneItem!= null)
        {
            
// добавляем вещь в инвентарь
            
items.Add(sceneItem.prefab);
            
// уничтожаем объект сцены
            
Destroy(sceneItem.gameObject);
        }

    }



Итак: Первый скрипт представляет собой описание элемента инвентаря. Второй - описание объекта сцены, на котором должен быть коллайдер в режиме триггера, при входе физического объекта в триггер - объект сцены говорит ему "возьми меня". Третий скрипт представляет собой сам инвентарь и GUI для его отображения. Примерный вид на первом скриншоте.

Нажмите на изображение для увеличения
Название: Inventory.png
Просмотров: 614
Размер:	26.2 Кб
ID:	11215

Каждый элемент инвентаря должен состоять из трех префабов (это в моем примере, у вас может быть меньше или больше): 1) префаб объекта, выбрасываемого в сцену; 2) префаб одеваемого объекта; 3) префаб, описывающий объект инвентаря, он в сцене не появляется, а используется по ссылке для создания двух других префабов.
Настройки этих префабов на следующих трех скриншотах в том же порядке.

Нажмите на изображение для увеличения
Название: prefabScene.png
Просмотров: 490
Размер:	58.7 Кб
ID:	11216

Нажмите на изображение для увеличения
Название: prefabEquip.png
Просмотров: 436
Размер:	54.9 Кб
ID:	11217

Нажмите на изображение для увеличения
Название: prefabInventoryItem.png
Просмотров: 438
Размер:	44.3 Кб
ID:	11218

Собственно сделать из этого рабочий вариант Вам придется самостоятельно, удачи

Прилагаю дополнительно пакадж со скриптами и префабами, если конечно это вам поможет
Вложения
Тип файла: zip inventory.zip (21.4 Кб, 329 просмотров)
__________________
Blitz3d to Unity Wiki

Последний раз редактировалось pax, 15.09.2010 в 10:37.
(Offline)
 
Ответить с цитированием
Эти 12 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Andvrok (26.02.2013), burovalex (24.02.2013), den (12.09.2010), Dream (12.09.2010), Fatalix3d (13.09.2010), HolyDel (12.09.2010), Illidan (14.09.2010), mnart (12.09.2010), Nex (12.09.2010), Nuprahtor (12.09.2010), Radnk (14.04.2013), shady (05.05.2011)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 04:58.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com