ゲームにスマートスクリプトを実装するにはどうすればよいですか?


18

ゲームエンジンを開発しています。エンティティ/コンポーネントベースのものであると想定されています。ゲーム自体を開発するために、スクリプト言語を使用してエンティティを実際に作成することを考えました。

たとえば、プレイヤーに攻撃的な種類のモンスターを追加したい場合、それはいくつかのコンポーネントを持つエンティティになります。これらのコンポーネントはモンスターの種類によって変わるため、ゲーム内に100種類のモンスターがいる場合、ゲームコードでそれらのそれぞれに対して新しいメソッドを直接作成する必要はありません。

コンポーネントの観点から、このエンティティを記述するためにスクリプト言語を使用する必要がありますか?より一般的には、ゲームでスクリプトを使用するにはどうすればよいですか?


エンティティの説明だけに使用できるのは、xmlなどのみで、スクリプトは不要です。...スクリプトのために私はC#を使用しますが、あなたのエンジンが.NETである場合にのみ
Kikaimaru

@Kikaimaru C#はスクリプト言語ではありません。luaを使用するか、エンジンに組み込むことができる他の言語を使用することをお勧めします。
JDSweetBeat

@DJMethaneMan「C#はスクリプト言語ではありません」という意味ではありません。C#で記述されたゲームでC#でスクリプトを記述し、Roselynのようなものをコンパイルに使用してもまったく問題はありません。 xmlとC#の代わりにjavascript :)
鬼丸

回答:


17

私のゲームは、エンティティコンポーネントフレームワークを使用し、スクリプトを使用してエンティティを定義します(これは動作を直接定義するものではありません。これについては最後に詳しく説明します)。スクリプトは、各エンティティの作成に使用される実際のコンポーネントを定義します。私が作成したシンプルなスクリプト言語を使用します。これは、私のスクリプトの1つの単純化されたバージョンです。

ENTITY:"Goblin"
{
    description="It's currently their age."
    commonname="goblin"
    pluralCommonName="goblins"
    childname="gob'in"
    pluralChildName="gob'ins"
    active=Nocturnal
    tags=Mobile
    baseAttributes="OrganicMobileCreature"

    [Model]{
            meshname="Goblin"
            texturename="GoblinTexture"
    }

    [Motion]{
            maxvelocity=0.01:0.015
            locomotion=Walk,Swim
    }

    [Skills]{
            ALL=0.01:0.05,Mine=8.3:8.8,PlaceCube=8.3:8.8
    }

    [Inventory]{
            maxItems=2
            Allow=ALL
            Disallow=NONE
    }
}

その多くは自己記述的ですが、ここにいくつかのハイライトがあります:

  • 最初のセクションでは、エンティティの一般的な情報について説明します。これには、エンティティのさまざまな側面の説明と表示名が含まれます。
  • このbaseAttributesタグは、複数回再定義する必要がない一般的なコンポーネントを定義する別のスクリプトファイルを参照します。それはのようなコンポーネントが含まれpositionliferequirementsなどを。ここでコンポーネントが再び定義されると、このコンポーネントは一般的なコンポーネントを上書きします。
  • [NAME] { }セットは、これらのエンティティに追加される新しいコンポーネントを定義します。
  • この説明は、単一のエンティティだけのものではなく、作成されたすべてのゴブリンのものです。いくつかの値には範囲(つまり0.01:0.015)があり、新しいゴブリンが作成されると、その範囲にランダムな値を持つコンポーネントが作成されます。そのため、各ゴブリンのスキルと速度はわずかに異なります。このセットアップは、すべてのゴブリンがキューブとマイニングの配置に非常に優れたスキルで開始することを定義します。これは、私自身のテスト目的のためだけです。しかし、推測できると思いますが、値を必要なものに変更するのは非常に簡単です。

このすべてには、カスタムパーサー、エンティティ定義を保持する何らかの種類の構造(レキシコンと呼んでいます!)、およびそれらのエンティティ定義を取得して新しいエンティティを生成するためのファクトリーの作成が含まれます。私にとって、このシステムはまだ初期段階にありますが、非常にうまくいっています。エンティティをすばやく定義するための非常に強力なシステムであり、作成したコンポーネントを使用して任意のエンティティを作成できます。独自のパーサーを作成することに不安がある場合は、XMLがうまく機能すると思います。私は、ちょっとしたプログラミング言語のために書いたプッシュバック再帰的パーサーから変換しました。

ご覧のとおり、これによりエンティティが定義されます。ふるまいを直接定義しないと述べました。ただし、嫌われている敵や、その敵にどれだけ積極的に反応するかなどを簡単に定義できます。これは、このような動作を制御するために使用するコンポーネントを定義するのと同じくらい簡単です。私のエンティティには、次のようなものを定義するインテリジェンスコンポーネント(図示せず)もあります。

  • 経路探索の方法(単純な視線の動き、単純なA *、予測A *など)
  • 彼らがどれほど攻撃的/防御的か。エンティティは、防御されるホームゾーンを持つことができますが、それらのゾーンの外では攻撃的ではない可能性があります。
  • 技術認識(ドアを開ける、ガジェットを使用する、トラップを避けるなど)
  • もっと...

どのように定義されていても、そのコンポーネント内のデータを駆動するのはシステムであり、これが順番にエンティティの動作に影響します。


共有してくれてありがとう。私は実際にXML形式を使用してそれをやろうとしていると思います。(AbstractChaos btwのおかげで)それについて多くのことを考えてきましたが、それは(少なくともエンティティの説明については)私のニーズを満たすべきです。
ネイサン

1
@nathan XMLを使用する必要があることに同意します。私の投稿の理由は、XMLに含めるデータとその使用方法でした。データの形式は任意です。含めることを選択したデータとその使用方法は、はるかに重要です。
マイケルハウス

@ Byte56この投稿は古いことは知っていますが、親子関係をどのように処理できますか?スキルツリーがあり、A [1]を有効にするにはスキルA [0]に10ポイント、A [2]を有効にするには10ポイントが必要だとします。これらをネストするか、フラットにしてキーParentId?明らかに論理的には同等ですが、実際の洞察が得られることを願っています。
Superstringcheese

@Superstringcheese if player.hasPoints(10) then i++ end skillTree[i]はいくつかの擬似コードになります。ただし、その質問が投稿にどのように関連するのかわかりません。
JDSweetBeat

4

本当に必要なのがMonsterのコンポーネントを定義する方法だけである場合、XMLはC#とjavaの両方でうまく機能します。

あなたのxmlは

<?xml version="1.0" encoding="UTF-8"?>
<mobs>
  <mob>
    <personality>Aggressive</personality>
    <intelligence>20</intelligence>
  </mob>
</mobs>

そうすると、Mobクラスは次のようになります。(Java)

public class Mob {
  private IPersonality personality;
  private Integer intelligence

  //**  Getters & Setters **//
}

IPersonalityはインターフェイスです。

その後、xmlをロードし、ファクトリーを介して各値を解析できます。

たとえば、パーソナリティ値を、単純なPersonalityFactoryに解析します。

public IPersonality getPersonality(String personalityName) {
  if(personalityName.equals("Aggressive")) {
    return new AggressivePersonality();
  }
  else if(personalityName.equals("Passive")) {
    return new PassivePersonality();
  }
  else {
     //Maybe allow for no personality (We all know monster like that ;) )
     return null; 
  }
}

その後、次のように暴徒を設定できます

Mob mob = new Mob();
mob.setPersonality(getPersonality(xmlValue));
mobList.add(mob);

重要なのは、エンジンがxmlの形式を認識しており、必要なすべてのファクトリがあることです。

xmlの利点の1つは、独自のスキーマを定義して、形式が常に正しいことを確認できることですこちらを参照してください

お役に立てれば


実際、私はゲーム開発プロセスでゲームを介して新しいエンティティを簡単に作成する方法を見つける必要があります。xmlは十分な柔軟性がありますか?とにかく内部ゲームロジックのスクリプトを追加する必要があります。
ネイサン

MobクラスをEntityとして読み取る場合、異なるコンポーネント(IPersonality、Intelligence [そのmobのデータの例])でXMLを使用して新しいEnitity(Mob)を作成しています。そして、残念ながら、指定したもの以外に何をしたいのかわからないので十分に柔軟であるかどうかは答えられませんが、XMLは各セクションの解釈方法だけが境界である形式です。詳細な例を使用して質問を更新すると、それを処理できるxmlが表示されます。内部のゲームロジックは内部にあるように聞こえますか?
AbstractChaos

0

Pythonは大丈夫だと思います。多くの場合、LUAは、スクリプト機能をプログラムに追加する場合の優れた代替手段です。

XMLを使用してモンスターの動作を記述することもできます。これには、実際のゲームコードでのコーディングが含まれます。これは、動作(速度、モンスターが使用する武器の種類、など)、ゲームコードで使用する動作の。

Scriptengine(LUAなど)を使用する場合、このコードをプリコンパイル済みプログラムからランタイム中にロードされるスクリプトファイルに転送できます。これを行うには、「モンスター」のAPIをスクリプトエンジンに公開する必要があります。これにより、外部からモンスターゲームコードのメソッドを呼び出すことができます。


私のモンスターのAPI?つまり、スクリプト(インスタンス化)から新しいコンポーネントを作成できる必要があります。出来ますか?
ネイサン

これは可能だろう。また、外部ストレージ(abstractchaosやbyte56で言及されているような)とスクリプト言語(LUA、Python ...)の混合アプローチを使用することもできます。たとえばLUAの主な利点は、実行時にコードを変更でき、実行中のゲーム/エンジンですぐに利用できることです
-Aron_dc

ほんとに?それは実に大きな利点です。また、「ゲームタイムライン」用にLUA(または他のスクリプト言語)を使用しています。つまり、プレイヤーをブロックしなければならないシーンを作成するには、このスプライトをあちこちに移動し、あちこちに移動する必要があります。また、別の質問を投稿して、「マネージャー」と呼ばれるものを介してエンティティ/コンポーネントを管理する現在の方法を公開し、うまくやっているかどうかを確認します。
ネイサン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.