Script UDK: Делаем инвентарь

(Материалы по UDK)

Модератор: Buxyr

Аватара пользователя
KrisGames

Универсал Коммандо Лидер
Командор
Сообщения: 1171
Рег. Ср апр 28, 2010 10:20 am
Награды: 3
Репутация: 428
Вклад в проект: 75
Откуда: Иваново
Благодарил (а): 129 раз
Поблагодарили: 19 раз

Script UDK: Делаем инвентарь

Сообщение KrisGames » Пн фев 20, 2012 12:50 pm

Прежде чем идти дальше и размещать учебник по инвентарю хочу предложить стандартный RPG инвентарь
Делаем менеджер инвентаря распространяемого на нашего актера:

Этот класс будет определять четыре вещи в нашем инвентаре а так-же проверять не полон ли он

код U_InventoryManager.uc

Код: Выделить всё

class U_InventoryManager extends Actor;
    var array<U_Items> UItems;
    var U_Items AddItem;
    var int Gold;
    var int MaxGold;
    var UHUD HUD;
    simulated event PostBeginPlay()
    {
 super.PostBeginPlay();
    `Log("Custom Inventory up");
       StartingInventory();
    }
    function AddGold(int GoldAmount)
    {
    if(Gold + GoldAmount >= MaxGold)
    {
    Gold = MaxGold;
    }
    else
    {
    Gold += GoldAmount;
    }
    }
    function bool CheckInventorySize(class<U_Items> ItemToCheck, int AmountWantingToAdd)
    {
    local int ItemAmountInInventory;
    local int i;

    for (i=0;i<UItems.Length;i++)
    {
       if (UItems[i].Class == ItemToCheck)
    {
    ItemAmountInInventory ++;
    `log(""@ItemToCheck$" Has"@ItemAmountInInventory$"Items");
      }
    }
    if((ItemAmountInInventory + AmountWantingToAdd) >= 50)
    {
    ItemAmountInInventory = 0;
    `log("no more Space for items");
    return true;
    }
    else
    {
    ItemAmountInInventory = 0;
    `log("has Space for items");
    return false;
    }
    }
    function StartingInventory()
    {
    AddInventory(class'U_HerbItem', 1);
    }
    function AddInventory(class<U_Items> ItemType, int Amount )
    {
    local int i;
    for ( i=0; i<Amount; i++ )
    {
    AddItem = Spawn(ItemType);
    UItems.AddItem(AddItem);
    }
    `log("There are" @ UItems.length @ "Items");
    }
    {
    local int i;
    local U_Items Item;
    for (i=0;i<UItems.Length;i++)
    {
       if (UItems[i].Class == ItemToRemove)
    {
    UItems.Remove(i,Amount);
    break;
    }
    }
    `log("Now there are only" @ UItems.length @ "Items!");
    foreach UItems(Item, i)
    {
    `log("Index=" $ i @ "Value=" $ Item);
    }
    }
    function NotifyHUDMessage(string Message, optional int Amount, optional string ItemName)
    {
    foreach AllActors(class'UHUD', HUD)
    {
    HUD.Message = Message;
    HUD.TAmount = Amount;
    HUD.ItemName = ItemName;
    HUD.bItemPickedUp = true;
    }
    }
    defaultproperties
    {
    Gold = 500
    MaxGold = 99999
    }


Далее нам нужно создать базу абстрактный класс, которая и будет наш инвентарь внутри HUD. Вы можете расширить и создавать многие этих классов

код U_Items.uc

Код: Выделить всё

class U_Items extends Actor abstract;

 код UItems.uc 

class U_HerbItem extends U_Items placeable;
код UHUD.uc
class UHUD extends UDKHUD;
var string Message;
var int TAmount;
var string ItemName;
var float Alpha;
var bool bItemPickedUp;
var Font PlayerFont;
event PostRender()
{
HandlePickUpMessage();
Super.PostRender();
}
function HandlePickUpMessage()
{
local float RenderTime;
local float X,Y,UL,VL;
Canvas.Font = PlayerFont;
Canvas.TextSize(""@Message$" "@TAmount$" "@ItemName$"(s)",UL,VL);
X = (SizeX / 2) - (UL/2);
Y = (200) - (VL/2);
Canvas.SetPos( X, Y);
Canvas.SetDrawColor(255, 255, 255, Alpha);
Canvas.DrawText(""@Message$" "@TAmount$" "@ItemName$"(s)");
if(bItemPickedUp == true)
{
if(RenderTime == 0)
RenderTime = WorldInfo.TimeSeconds;
}
if(`TimeSince(RenderTime) > 1.0)
{
Alpha = Lerp(Alpha, 0 , 0.05);
RenderTime -= 0.1;
}
else
{
RenderTime = 0;
Alpha = 255;
bItemPickedUp = false;
}
}


Разместите в своем pawn классе следующий код:

Код: Выделить всё

var class<U_InventoryManager> UInventory;
var repnotify U_InventoryManager UManager;
simulated event PostBeginPlay()
{
super.PostBeginPlay();
`Log("Custom Pawn up");
//Set up custom inventory manager
if (UInventory != None)
{
UManager = Spawn(UInventory, Self);
if ( UManager == None )
`log("Warning! Couldn't spawn InventoryManager" @ UInventory @ "for" @ Self @ GetHumanReadableName() );
}
}
defaulproperties
{
bCanPickUpInventory = true
UInventory = U_InventoryManager
}


Теперь нам нужно создать собственно пикап, который добавляет абстрактные классы в инвентарь. Эти классы могут воспроизводить звуки на подобрать отображения сообщения и т.д.

код U_WorldItemPickup.uc
Примечание: Убедитесь, что вы замените UHeroPawn своим классом.

Код: Выделить всё

class U_WorldItemPickup extends Actor placeable;
var() editconst const CylinderComponent CylinderComponent;
var() const editconst DynamicLightEnvironmentComponent LightEnvironment;
var U_InventoryManager InvManager;
var() string ItemName;
var() string PickupMessage;
var() SoundCue PickupSound;
var() class<U_Items> ItemType;
var() int ItemAmount_ADD;
var UHeroPawn UHP;
event Touch(Actor Other, PrimitiveComponent OtherComp, Vector HitLocation, Vector HitNormal)
{
super.Touch(Other, OtherComp, HitLocation, HitNormal);
UHP = UHeroPawn(Other);
if (UHP != none)
{
    if(!(UHP.UManager.CheckInventorySize(ItemType, ItemAmount_ADD)))
{
    GiveTo(UHP);
PlaySound(PickUpSound);
UHP.UManager. NotifyHUDMessage(PickUpMessage, ItemAmount_ADD, ItemName);
}
}
}
function GiveTo( UHeroPawn Other )
{
if ( Other != None && Other.UManager != None )
{
Other.UManager.AddInventory(ItemType, ItemAmount_ADD );
Destroy();
}
}
defaultproperties
{
Begin Object Class=DynamicLightEnvironmentComponent Name=MyLightEnvironment
bEnabled=TRUE
End Object
LightEnvironment=MyLightEnvironment
Components.Add(MyLightEnvironment)

Begin Object class=StaticMeshComponent Name=BaseMesh
  StaticMesh=None
Scale = 3.5
LightEnvironment=MyLightEnvironment
End Object
Components.Add(BaseMesh)

Begin Object Class=CylinderComponent NAME=CollisionCylinder
CollideActors=true
CollisionRadius=+0040.000000
CollisionHeight=+0040.000000
bAlwaysRenderIfSelected=true
End Object
CollisionComponent=CollisionCylinder
CylinderComponent=CollisionCylinder
Components.Add(CollisionCylinder)

bHidden=false
bCollideActors=true
}


Вот и все инвентарь готов.


По материалам rusudk.ru


ICQ : 470-451-451
Mail: KrisGames@yandex.ru

Вернуться в «Конструктор UDK»

 

 

cron