Делаем менеджер инвентаря распространяемого на нашего актера:
Этот класс будет определять четыре вещи в нашем инвентаре а так-же проверять не полон ли он
код 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