Author: "mktwo"
Перевод: Vadakuma
Оригинал статьи, ее обсуждение
Прежде всего убедитесь, что Вы уже знаете как устанавливать эти коды, т.к. в этом титориале это не объясняется.Во вторых, я полагаю что Вы уже немного знакомы с UnrealScript. Например Вы должны знать как наследуемые классы работают и как делается свой тип игры, как сделать свой собственный HUD, PlayerController и т.д. Если Вы не знаете всего этого то можно некоторые вещи посмотреть на этом сайте(в дальнейшем тут будет намного больше информации о UnrealScript),также на других русских сайтах и естественно на заморских.например тут и тут.
HUD создан по этому тутору
Необходимый набор скриптов, для реализации задачи:
MyGame.uc
Скрипт описывает созданный тип игры
MyPlayerController.uc
Получаем экспу, повышаем левел. Методы не находятся в MyPawn, для того чтобы опыт сохранялся после смерти.(хотя конечно можно и изловчиться)
SeqAct_GiveXP.uc (optional)
В этом скрипте мы создаем Sequence Action, который будем использовать в Kismet.
MyHUD.uc
Скрипт рисует на экране шкалы со здоровьем, текущем уровнем и количеством опыта.
Используем Kismet для изменения системы получения опыта
Сначала Вы должны сделать триггер, жмем Add Actor > Add Trigger.
Дальше выбираем триггер и идем в kismet. Добавляем триггер New Event Using Trigger_0 > Touch. Добавляем Add XP-action.
Соединяем Touched с In.
Далeе New Variable > Player > Player и цепляем к target.
New Variable > Int > Int и пишем количество начисляемого опыта за одно убийство и цепляем к Amount
Сохраняем и наслаждаемся результатом!
Перевод: Vadakuma
Оригинал статьи, ее обсуждение
Прежде всего убедитесь, что Вы уже знаете как устанавливать эти коды, т.к. в этом титориале это не объясняется.Во вторых, я полагаю что Вы уже немного знакомы с UnrealScript. Например Вы должны знать как наследуемые классы работают и как делается свой тип игры, как сделать свой собственный HUD, PlayerController и т.д. Если Вы не знаете всего этого то можно некоторые вещи посмотреть на этом сайте(в дальнейшем тут будет намного больше информации о UnrealScript),также на других русских сайтах и естественно на заморских.например тут и тут.
HUD создан по этому тутору
Необходимый набор скриптов, для реализации задачи:
- MyGame.uc
- MyPlayerController.uc
- SeqAct_GiveXP.uc (optional)
- MyHUD.uс
MyGame.uc
Скрипт описывает созданный тип игры
class MyGame extends UTGame;
// Функция, которая выполняется после каждого убийства
function ScoreKill(Controller Killer, Controller Other)
{
local MyPlayerController PC;
super.ScoreKill(Killer, Other);
PC = MyPlayerController(Killer); // Cast to the custom MyPlayerController class
PC.GiveXP(100); //Позволяет изменять кол-во получаемого опыта
}
DefaultProperties
{
// DefaultPawnClass = class'UTGame.UTPawn'
PlayerControllerClass = class'MyGame.MyPlayerController'
HUDType = class'MyGame.MyHUD'
}
MyPlayerController.uc
Получаем экспу, повышаем левел. Методы не находятся в MyPawn, для того чтобы опыт сохранялся после смерти.(хотя конечно можно и изловчиться)
class MyPlayerController extends UTPlayerController
config(MyGame);
const MAX_LEVEL = 50;
const XP_INCREMENT = 500; // Кол-во опыта до следующего уровня
var int XP; // Общая сумма собранных XP
var int Level; // Current level
var int XPGatheredForNextLevel; // Количество XP собранных
var int XPRequiredForNextLevel; // Количество необходимых XP до нового уровня
//При старте игры мы подсчитываем сколько нужно получить опыта чтобы перейти на новый уровень
simulated function PostBeginPlay()
{
super.PostBeginPlay();
// Обсчитываем свойства при старте игры
CalculateLevelProgress();
}
//Здесь мы объявляем функцию,которая позволяет поменять кол-во опыта нужного для следующего уровня через Kismet
// Функция вызываемая из Kismet
public function AddXP(SeqAct_GiveXP action)
{
GiveXP(action.Amount); // Количество опыта получаемого с учетом установки в Kismete
}
//Функция добавления опыта
public function GiveXP(int amount)
{
self.XP += amount;
CalculateLevelProgress();
while (self.XPGatheredForNextLevel >= self.XPRequiredForNextLevel && self.Level < MAX_LEVEL)
{
self.Level++;
// Пересчитываем опыт после левел апа
CalculateLevelProgress();
}
}
//Дальше мы объявляем функцию которая считает, сколько нужно еще опыта для достижения следующего уровня.
private function CalculateLevelProgress()
{
local int xpToCurrentLevel; // Текущее количество накопленного опыта
xpToCurrentLevel = XP_INCREMENT * (self.Level - 1);
self.XPGatheredForNextLevel = self.XP - xpToCurrentLevel;
self.XPRequiredForNextLevel = self.Level * XP_INCREMENT;
}
DefaultProperties
{
Level = 1;
XP = 0;
}
SeqAct_GiveXP.uc (optional)
В этом скрипте мы создаем Sequence Action, который будем использовать в Kismet.
class SeqAct_GiveXP extends SequenceAction;
var() int Amount; // Amount of XP this action will give
//Добавляем немного инфы чтобы было удобнее использовать в kismete
DefaultProperties
{
// Имя функции в Kismet Editor
ObjName="Add XP"
// Имя функции при использовании
HandlerName="AddXP"
Amount = 0
// Показывает входы и выходы модуля в Kismetе
VariableLinks(1)=(ExpectedType=class'SeqVar_Int', LinkDesc="Amount", bWriteable=true, PropertyName=Amount)
}
MyHUD.uc
Скрипт рисует на экране шкалы со здоровьем, текущем уровнем и количеством опыта.
class MyHUD extends UTHUD;
function DrawBar(String Title, float Value, float MaxValue,int X, int Y, int R, int G, int B) // Функция рисования шкал
{
local int PosX; //объявляем переменную представляющую позицию откуда начинать рисовать
local int BarSizeX; //Объявляем переменную регулирующую
PosX = X; //Начальная точка, откуда начинаем рисовать прямоугольник
BarSizeX = 300 * FMin(Value / MaxValue, 1); // размер активного прямоугольника (Увеличивайте 300 чтобы увеличить прямоугольник)
//Рисуем закрашенный прямоугольник
Canvas.SetPos(PosX,Y);
Canvas.SetDrawColor(R, G, B, 200);
Canvas.DrawRect(BarSizeX, 12);
//Рисуем пустой прямоугольник
Canvas.SetPos(BarSizeX+X,Y);
Canvas.SetDrawColor(255, 255, 255, 80);
Canvas.DrawRect(300 - BarSizeX, 12); //Увеличивайте 300 чтобы увеличить прямоугольник
//Рисуем наше заглавие
Canvas.SetPos(PosX+300+5, Y); //Change 300 to however big your bar is
Canvas.SetDrawColor(R, G, B, 200);
Canvas.Font = class'Engine'.static.GetSmallFont();
Canvas.DrawText(Title);
}
function DrawGameHud()
{
local MyPlayerController PC;
PC = MyPlayerController(PlayerOwner);
if ( !PlayerOwner.IsDead() && !UTPlayerOwner.IsInState('Spectating')) //If player is not dead or spectating... ( you could also //use DrawLivingHud() )
{
DrawBar("Health:"@PlayerOwner.Pawn.Health@"%",PlayerOwner.Pawn.Health, PlayerOwner.Pawn.HealthMax,20,20,200,80,80); //...draw our health-bar
DrawBar("Level:"@PC.Level, PC.Level, PC.MAX_LEVEL ,20,40,200,200,200); //...and our level-bar
if ( PC.Level != PC.MAX_LEVEL ) //If our player hasn't reached the highest level...
{
DrawBar("XP:"@PC.XPGatheredForNextLevel$"/"$PC.XPRequiredForNextLevel, PC.XPGatheredForNextLevel, PC.XPRequiredForNextLevel, 20, 60, 80, 255, 80); //...draw our XP-bar
}
}
}
Используем Kismet для изменения системы получения опыта
Сначала Вы должны сделать триггер, жмем Add Actor > Add Trigger.
Дальше выбираем триггер и идем в kismet. Добавляем триггер New Event Using Trigger_0 > Touch. Добавляем Add XP-action.
Соединяем Touched с In.
Далeе New Variable > Player > Player и цепляем к target.
New Variable > Int > Int и пишем количество начисляемого опыта за одно убийство и цепляем к Amount
Сохраняем и наслаждаемся результатом!
А подойдёт ли эта система для ММО игр?
ReplyDeleteПредставленная система являет собой лишь упрощенный пример как можно реализовать накопление и использование опыта/очков.
DeleteЗдесь нет возможности сохранять накопленные очки и изменения(все очки сбрасываются при перезагрузки уровня/игры или уничтожения класса MyPlayerController), также нет поддержки сетевого режима.
Т.е. конкретно от представленных скриптов в сетевой игре толку мало, но их реально адаптировать под работу по сети.
Hi i have been using this sample of code for awhile you are great man! i need help making a sequence condition for a slot machine volume trigger that activates random win 1-100 if the player has 1 dollar (score) to put into the machine. but, i cannot figure this out can you help me and would it be based off this code also?
ReplyDelete