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

Прежде чем идти дальше и размещать учебник по инвентарю хочу предложить стандартный 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
}



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

Комментариев нет:

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.