현재 C++로 3D 액션/RPG 게임을 개발 중입니다. 게임의 AI를 프로그래밍하기위한 스크립팅 언어를 선택하는 데 조언이 필요합니다. 우리 팀은 modding 배경에서 왔고, 실제로 우리는 여전히 Gothic 게임 모드에서 작업을 마무리하고 있습니다. 그 게임 (우리도 영감을 얻었습니다)에서 언어 DAEDALUS (피라 냐 바이트 (Piranha Bytes)가 만든 게임의 제작자)가 사용되었습니다. Here is a full description of said language.게임용 스크립팅 언어 선택 및 구현
주된 점은 클래스보다 인스턴스를 사용한다는 점입니다. 게임 엔진이 닫혀 있으므로이 언어의 내부 구현에 대해서만 추측 할 수 있지만 스크립팅 언어에서 가장 중요한 것은 (이상적으로는 비슷하지만 바람직하게는 DAEDALUS보다 강력 함) 사실입니다. 클래스, 인스턴스 및 인스턴스 (인스턴스의 인스턴스)와 같은 사실상 3 가지 '클래스 분리'가 있음을 알 수 있습니다.
예제를 제공하면 원하는 것을 이해하는 것이 더 쉬울 것이라고 생각합니다. 정규 NPC를 가져 가라.
CLASS C_NPC
{
VAR INT id ; // absolute ID des NPCs
VAR STRING name [5] ; // Namen des NPC
VAR STRING slot ;
VAR INT npcType ;
VAR INT flags ;
VAR INT attribute [ATR_INDEX_MAX] ;
VAR INT protection [PROT_INDEX_MAX];
VAR INT damage [DAM_INDEX_MAX] ;
VAR INT damagetype ;
VAR INT guild,level ;
VAR FUNC mission [MAX_MISSIONS] ;
var INT fight_tactic ;
VAR INT weapon ;
VAR INT voice ;
VAR INT voicePitch ;
VAR INT bodymass ;
VAR FUNC daily_routine ; // Tagesablauf
VAR FUNC start_aistate ; // Zustandsgesteuert
// **********************
// Spawn
// **********************
VAR STRING spawnPoint ; // Beim Tod, wo respawnen ?
VAR INT spawnDelay ; // Mit Delay in (Echtzeit)-Sekunden
// **********************
// SENSES
// **********************
VAR INT senses ; // Sinne
VAR INT senses_range ; // Reichweite der Sinne in cm
// **********************
// Feel free to use
// **********************
VAR INT aivar [50] ;
VAR STRING wp ;
// **********************
// Experience dependant
// **********************
VAR INT exp ; // EXerience Points
VAR INT exp_next ; // EXerience Points needed to advance to next level
VAR INT lp ; // Learn Points
};
그런 다음, 당신은 또한 (일부 기본값을 설정하는) 프로토 타입을 정의 할 수 있습니다 : 우선 당신은 엔진 내부의 (클래스 또는 구조)를 반영한다 (이해) 정의 된 클래스가 있습니다. 그러나 실제로 정의 어떻게 NPC는 다음과 같이이다 : 당신이 볼 수 있듯이
instance BAU_900_Ricelord (Npc_Default) //Inherit from prototype Npc_Default
{
//-------- primary data --------
name = "Ryzowy Ksiaze";
npctype = NPCTYPE_GUARD;
guild = GIL_BAU;
level = 10;
voice = 12;
id = 900;
//-------- abilities --------
attribute[ATR_STRENGTH] = 50;
attribute[ATR_DEXTERITY] = 10;
attribute[ATR_MANA_MAX] = 0;
attribute[ATR_MANA] = 0;
attribute[ATR_HITPOINTS_MAX]= 170;
attribute[ATR_HITPOINTS] = 170;
//-------- visuals --------
// animations
Mdl_SetVisual (self,"HUMANS.MDS");
Mdl_ApplyOverlayMds (self,"Humans_Arrogance.mds");
Mdl_ApplyOverlayMds (self,"HUMANS_DZIDA.MDS");
// body mesh ,bdytex,skin,head mesh ,headtex,teethtex,ruestung
Mdl_SetVisualBody (self,"Hum_Body_CookSmith",1,1,"Hum_Head_FatBald",91 , 0,-1);
B_Scale (self);
Mdl_SetModelFatness(self,2);
fight_tactic = FAI_HUMAN_STRONG;
//-------- Talente --------
Npc_SetTalentSkill (self,NPC_TALENT_1H,1);
//-------- inventory --------
CreateInvItems (self, ItFoRice,10);
CreateInvItem (self, ItFoWine);
CreateInvItems(self, ItMiNugget,40);
EquipItem (self, Heerscherstab);
EquipItem (self, MOD_AMULETTDESREISLORDS);
CreateInvItem (self, ItMi_Alchemy_Moleratlubric_01);
//CreateInvItem (self,ItKey_RB_01);
EquipItem (self, Ring_des_Lebens);
//-------------Daily Routine-------------
daily_routine = Rtn_start_900;
};
FUNC VOID Rtn_start_900()
{
TA_Boss (07,00,20,00,"NC_RICELORD");
TA_SitAround (20,00,24,00,"NC_RICELORD_SIT");
TA_Sleep (24,00,07,00,"NC_RICEBUNKER_10");
};
는, 인스턴스 선언은 값을 설정하고 내에서 함수를 호출, 더 생성자 함수와 같다. 이것은 여전히 많은 문제를 제기하지 않을 것입니다. 하나 이상의 문제가 아니라면이 인스턴스를 여러 개 복사하십시오. 예를 들어, 여러 개의 BAU_900_Ricelord
을 생성 할 수 있으며 각자 자신의 AI 상태, 히트 포인트 등을 추적합니다.
이제는 인스턴스가 int (NPC의 ID로 표시 될 수도 있음) (스크립트 내에서) 표현식 BAU_900_Ricelord
을 사용할 때마다 int 변수에만 할당 할 수 있고 NPC에서 작동하는 대부분의 함수는 해당 int 값을 사용합니다. 그러나 직접 hitpoints 등을 수정하려면 var C_NPC npc = GetNPC(Bau_900_Ricelord); npc.attribute[ATR_HITPOINTS] = 10;
과 같은 것을해야합니다. 즉, 그것을 나타내는 실제 C_NPC 객체를 얻습니다.
마침내 요약하면 알 수있는 스크립팅 언어에서 이러한 종류의 동작을 얻는 것이 가능한지, 아니면 내 자신을 만들 필요가 있습니까? 아니면 NPC와 그들의 행동을 그렇게 표현하는 더 좋은 방법이있을 수도 있습니다. 저를위한 스크립팅을위한 이상적인 언어는 C# 일 것입니다. 단순히 그 언어를 좋아하지만 어쨌든 C#에서 비슷한 종류의 동작을 시도하거나 구현하는 것이 가능하거나 실제로 가능하지는 않습니다.
많은 감사합니다.
C#은 CLR로 컴파일되므로 일반적으로 "스크립팅"을 위해 사용하면 안됩니다. – alternative
내 명명 규칙을 용서해주십시오.이 경우 스크립트 코드는 엔진 코드의 일부가 아니고 스크립트 코드의 일부가 아니므로 스크립트가 실제로 컴파일 된 경우 더 좋을 것이라고 생각합니다 (DAEDALUS의 경우도 마찬가지 임) –