重要!
APIを開放した直後から、私たちはコードにいくつかの大変更を行っています。
基本APIゲートウェイ(単純な通信規約)は互換性を維持する必要がありますが、ブロックのAPIはユーザーがアクセスする方法に変更があるでしょう。
ロジックは名前の変更や、機能の追加があるでしょうが、それ以外は変更されません。
スクリプトを書く準備
お好みのIDE(我々はVisual Studio 2012を使用しています)から新しいプロジェクトを作成します。
ユーザーがコードをコンパイルすることはないので、プロジェクトの種類は問いません。
インテリセンス(Visual Studioの支援機能)やハイライトのためにIDEを使用します。
ユーザーのBinフォルダに格納されている我々のライブラリを参照してください。(もう一度言いますが、それだけのためなので、アーキテクチャは重要ではありません)
ユーザーは、開発中のコード、自分が使用するコードの一部をダウンロードしたもの、他のプレイヤーが使用しているスクリプトを、試すことができます。
エントリーポイント
ゲーム情報を取得するには、Sandbox.ModAPI.MyAPIGatewayが提供するインターフェースを使用する必要があります。
ユーザーが得られる情報の多くは、上記のインターフェースを通じて取得してください。それらはあなたが得ることが出来る情報です。
彼らはフィルターとしての役割を持ち、あなたのコードでアクセス可能かを判別し、また、コードの同一性を検証します。
その結果、動作するか、ゲームが落ちます。
コード実行入門
これにはいくつかの方法があります。
- MyAPIGateway.Utils.MessageEnteredにハンドラを追加します。プレイヤーのチャット入力に応じて、コードが実行されます。
- MySessionComponentBaseクラスを継承します。属性を追加し、ワールドの生成やロードを行う前にロードされ、その後にフレームを更新します
- MyGameLogicComponentクラスを継承します。属性を追加し、任意のオブジェクトに関連付けられます。
使用例(作成者:トーマス)
SirBeacon - MyGameLogicComponentクラスを継承
あなたはBeaconに関連付けされたスクリプトを確認できます。プレイヤーが近くに来た時に、礼儀正しく挨拶します。
サンプル追加ミッション
ファイル場所
Mods\(MOD名)\Data\Scripts\(スクリプト名)\
の中に全て.csファイル(C#ソースコードのファイル)として保存する。
コードのデバッグ
現在のデバッグ用オプションは制限している。
スクリプトを使ったMODをロードした後、コンパイルされたコードか、制限に抵触しているコードのリストをF11画面を見ることができます。
ゲームをクラッシュしないように、構造化例外処理(try-catchブロック)を利用し、デバッグ中に例外が発生した時、カスタムログファイルに例外を書き込むすることができます。
制限事項(訳しきれませんでした・・・)
スクリプトには少なくともDLL、MODとして配布されるスクリプト、ゲーム内スクリプトの三段階があるでしょう。
- MODとして配布されるスクリプト
私たちは、ウィルスやトロイの木馬の動作を行うプログラムを全てブラックリストとして排除することができないため、 下記のホワイトリスト以外を使用したプログラムをワークショップで配布できないようにしました。
- DLLとして配布される改変プログラム
上記のような規制があってはいけません。それらはコミュニティAPI(?)が配布されます。
- ゲーム内スクリプト
高度に制限される上で、誰もが実行時にそれを書くことができます。それらのプレビューがModAPI.Ingameです。
ホワイトリスト
下記以外のパッケージを使用するプログラムはワークショップから配布できません!
- System 名前空間内使用可能クラス・構造体
- Int32(int), Int16(short), Int64(long), UInt32(uint), UInt16(ushort), UInt64(ulong), Double(double), Single(flort), Boolean(bool), Char(char), Byte(Byte), SByte(sbyte)
- 要は.Net組込み構造体セット。カッコ内は別名(エイリアス)
- Exception(例外クラス)
- NullReferenceException
- ArgumentException
- ArgumentNullException
- InvalidOperationException
- FormatException
- DivideByZeroException
- InvalidCastException
- Math
- Enum
- Decimal
- DateTime
- TimeSpan
- Object
- IDisposable
- Random
- Convert
- Nullable<>
- System.IO 名前空間内
- Stream, TextWriter, TextReader
- 標準入出力ストリーム。入力はチャット欄。出力は画面中央下。
- System.Collections.IEnumerator
- System.Collections.Generic 名前空間内
- IEnumerable<>, HashSet<>, Queue<>
- System.Linq.Enumerable
- System.Text.StringBuilder
- System.Text.RegularExpressions.Regex;
- System.Timers.Timer;
- System.Globalization.Calendar;
- System.Xml.Serialization 名前空間内
- XmlElementAttribute
- XmlAttributeAttribute
- XmlArrayAttribute
- XmlArrayItemAttribute
- XmlAnyAttributeAttribute
- XmlAnyElementAttribute
- XmlAnyElementAttributes
- XmlArrayItemAttributes
- XmlAttributeEventArgs
- XmlAttributeOverrides
- XmlAttributes
- XmlChoiceIdentifierAttribute
- XmlElementAttributes
- XmlElementEventArgs
- XmlEnumAttribute
- XmlIgnoreAttribute
- XmlIncludeAttribute
- XmlRootAttribute
- XmlTextAttribute
- XmlTypeAttribute
- Sandbox.ModAPI.Ingame.IMyCubeBlock
- Sandbox.ModAPI.IMySession
- Sandbox.ModAPI.Interfaces.IMyCameraController
- Sandbox.Common.MySessionComponentBase
- Sandbox.Common.ObjectBuilders.MyObjectBuilder_Base
- Sandbox.Common.ObjectBuilders.Voxels.MyObjectBuilder_VoxelMap
- Sandbox.Common.Components.MyComponentBase
- Sandbox.Common.Localization.MyTextsWrapper
- Sandbox.Definitions.MyDefinitionId
- VRageMath.Vector3
- VRage.Voxels.MyStorageDataCache
- VRage.MyFixedPoint
- Sandbox.Common.ObjectBuilders.VRageData.SerializableVector3
- VRage.Collections.ListReader<>
- Sandbox.Common.ObjectBuilders.Definitions.SerializableDefinitionId
- VRage.Common.Utils.MyStringId
詳細
貴方自身が探してる間にいくつかのことがわかるかもしれない。
その中の一部は、ゲーム内部のオブジェクト名になります。
ObjectBuilder: オブジェクトの状態をシリアライズ&デシリアライズするために使用される構造を保存する。
CubeGrid: 船やステーション。
SlimBlock: メモリ最適化に対応するためのブロックのベース。アーマー、キャットウォーク、スロープなど。
FatBlock: ロジックや機能を備えた、ブロックのベース。ドア、製油所、ピストンなど。
コメント
- 翻訳元はhttp://steamcommunity.com/sharedfiles/filedetails/?id=315625486であってるかな?まるっと翻訳する場合は原文へのリンクがあるとありがたいです -- 2014-09-20 (土) 07:49:03
- まるっと翻訳してるわけじゃないのか・・・ただ「訳しきれませんでした・・・」を見て、原文読もうと思って、どこだ?wとなったわけです -- 2014-09-20 (土) 07:53:41
- そうですそうですー、ありがとうです。しっかしまぁ、自分で動かすだけなら良かったけど、マルチで動きそうにもないw -- 2014-09-20 (土) 21:35:54