R.I.N.G.について分析 #Minecraft #Jointblock
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

R.I.N.G.について分析 #Minecraft #Jointblock

2017-04-12 12:45
  • 38
非公式フォーラムに書かれたR.I.N.G.部分だけを抜粋して、
自分なりに解説を加えたものです。

コメント欄は書き込み自由です。
意見、質問に使ってください。

※例によって記事内の文書や画像の転用OKです。
 ただし間違ってる部分もあると思うので自己責任で。

──────────────────────────────────
0.7.0&0.7.10.7.2&0.7.3R.I.N.G.について分析

↓R.I.N.G.のノード一覧と、各ノードの意味を調べてます。
R.I.N.G.の取説 

 0.7.0のRING説明はこのページに移動しました。2017/5/11
 非公式フォーラムにR.I.N.G.専用の研究トピックを作ってみました。 2017/5/15
──────────────────────────────────
0.7.0 2016年9月04日 37ページ目 PostNo.282272

[R.I.N.G.仕様]

◆ユニットの燃料画面でセットすることでアセンブル後は毎tick動き、各ノードの処理を実行していきます
◆ページ毎にMAX24ノード、32ページまでひとつのR.I.N.G.に登録可能です
◆サイクルモードでは前回tickで止まった場所から再開します
 ショットモードでは毎tick0ページ0ノードから処理を開始します
◆サイクルモードでは1tick内に無限にノードを処理できるわけではなく、
 下記のルールに従ってtick内処理を中断して次のtickに処理を引き継ぎます
 (ルール①)
  同tick内で同じノードを二度実行しようとすると中断。次tickはそのノードから始まります
 (ルール②)
  24(1リングMAXノード数)*3=72の数のノードを処理すると中断
 上記いずれの場合でも次tickは前tickに中断したノードから始まります。
 以上ルールによってひとつのユニットが無限にCPUリソースを消費することを防いでいます
 ただ、上記仕様のためノードの処理がどこで止まるか、また、
 どこから再開されるかの保障はなく、意図した動作にならない場合もあると思います。
 必ずtick内に動作させたいノードがある場合などはショットモードを選択してみてください

◆全てのノードは出力を持ち、他のノードから参照されたときに必ず何かの値を出します
 基本的には
  ・真偽値(TRUE,FALSE)
  ・実数(浮動小数点)
  ・整数(浮動小数点を受け取り手に応じて整数に切り捨てたもの)
 が返されます

ここ重要( ・´ω`・)っ∥

◆ノードは大別して
  ST系ノード(シンタックス系ノード。つまり構文ノードです)
  DR系ノード(命令形ノード。ユニットやパーツへチャンネルを解して命令を出すノードです)
  TG系ノード(トリガー系ノード、あるいはセンサー系ノードと呼んだほうがいいかも?)
 に分けられます
◆上記DR系ノードは実行される際、必ずその仕事内容と関わる「チャンネル」を介して実行を行います
 チャンネルには一つのノードのみ登録でき、
 あるノードが登録されている間は他のノードの登録を受け付けません

 (強制的にクリアするためのノードもありますが、基本的にはこのルールです)
 全てのDR系ノードには「仕事期間(tick)」があり、仕事期間を経過するとチャンネルから退きます

移動系DRは前後左右上下の各移動チャネル、モーションはモーションチャネル
アクションはアクションチャネルを使うよです。※下の方に図解あり

◆OPCutにチェックを入れたR.I.N.Gがセットされたユニットは席1の基本操作を受け付けなくなります
◆変数系ノードの内部値はjavaのdoubleすなわち倍精度(64bit)浮動小数点です
◆シングルでプレイしている場合のみ/jbringdebugコマンド(/jbrd・/jbdrでも可)
 「/jbringdebug on/off またはスロット番号」
 スロット番号は左上から右へ0, 1、左下から2, 3です
 (サーバーサイドから直接実行情報を見に行っているだけなので外部サーバーの場合は情報を取れません)
 サーバーから情報をネット越しに送信するようにすればマルチでもデバッグ可能ですが。。たぶんやりません)

あ、デバックできるんだ(*゚Д゚*)

<20160905 GUIの機能について追記>
◆左のノードリストからドラッグ&ドロップでノードをページに追加

◆ページのリング状でノードを選択し、右側に表示された入力項目から各ノードの値を設定

◆REFとFIXが切り替えられる項目について
 F
IX(:FIXED=固定値)はユーザーが入力した値そのままを利用します
 R
EF(:REFERENCE=参照値)は指定したノードの出力値を利用します
 ※例えばモーションDRノードでローテーターの回転値を
  ユーザーのYAWから取りたい場合などは
  ユーザー状態センサーノードのYAW(相対)から
  Y軸の値をとることで追従っぽいことが可能です。
  (ただユーザー状態センサーノードの各検出値は
  乗っていない場合でも0を出力するのでその切り替え判断も必要ですが)
ここ重要( ・´ω`・)っ∥ 入力ノードのチェックボックスの奴ね。
FんときチェックいれるとRになる。

◆REF項目があるノードは左クリックでドラッグすることで線を他のノードへ接続可能
 (※もちろんノードインデックスを直接指定するのでもOK)
◆Shiftを押しながらリング上のノードをクリックすることで複数選択が可能
◆ノードのTIPSに書いてあるInfやNaNって?
 Infは浮動小数点表現の無限


 NaNは不正な計算(ゼロ除算とか)などにより生じる非数のことです


──────────────────────────────────
0.7.1  2016年9月11日 38ページ目 PostNo.282868 Ringはバグ修正のみ

──────────────────────────────────
46ページ目 PostNo.299844

2017年4月05日(水) 21:59

[0.7.2新要素一覧]
◆ターゲットシステム
 
RINGにやらせたかったことを実現するキモの新システムです
 ユニットあたり5つのターゲットを持つことが出来ます
 設定したターゲットはキーMCTLの新機能「ターゲットへ回転(ローテーター用)」と組み合わせることで
 パーツをターゲット方向へ向けることができたり、RINGの「移動タスクノード」と合わせて自律移動などを行わせたりできます


 [ターゲット指定方法その①:ターゲットサイトアイテム]
 ユニットに搭乗して新アイテム「ターゲットサイト」を持つと一定範囲のEntity上にターゲット選択リングが現れるので
 右クリックでターゲットを選択することができます
 複数選択する場合は右クリックを押しっぱなしでそれぞれをドラッグオーバーしてください
 ctrlキーを押すごとにターゲットの指定方法が「生物のみ」「Entity全て」「ブロック指定」に切り替わります
 ブロック指定の状態ではブロック座標をひとつのみターゲットとすることができます
 [ターゲット指定方法その②:RINGのノード「ターゲット設定指示ノード」]
 後述のセンサーノードの機能などで取得したEntityIDをターゲット指定ノードに渡してやることで
 RING内でターゲットを指定することが出来ます
 
 なお0番ターゲットは固定でアセンブル主になります
 上手く組み合わせればRINGでターゲットを自動検索して射撃する機体なんかも作れるかも
 
 (※注意※ターゲット情報はEntityの保存情報に含まれていません
  セーブ・ロードを挟む、チャンクのアンロードを挟むなどで頭は空っぽになるのでご留意のうえご活用ください)
 
◆センサー機能(主にRINGで使用)
 新アイテム「センサーMCTRL」を配置することで対象ブロックを位置センサーとしてRINGに認識させることができます
 「センサー状態検知ノード」よりセンサーの位置を取得することができるほか、
 「Entity検索指示ノード」により検索されたEntityIDを取り出すこともできます
 
◆移動タスク指示(RING機能)
 ターゲットに追従してユニットを移動させることができます
 ただ経路検索のコストがユニットの高さに比例して跳ね上がるので、一般MOBなどに比べると若干頭が悪いところがあります
 ジャンプを活用しないなどもろもろの制限はありますが、その点ご理解いただけるとありがたいです
 
 (※ごめんなさい。ひとまず歩行系とホバー・ヘリだけの対応です。エアクラフト・フロート・宇宙などは未実装です)

◆Entity状態検知ノードとBlock状態検知ノード
 それぞれEntityIDやブロック座標を渡してやるとそのEntity/Blockの一部情報を取得して出力します
 ※ただし「Block状態検知」のほうは現状唯一のオーバーパワーノードとして「enableOverpowerNode」設定の影響を受けます
  設定ファイルを変えるか(デフォルトでは否設定)、「jbcset enableOverpowerNode true」で一時的に有効化できます
  (使い方によっては鉱脈検索機なども作れてしまうため)

◆ベクタ入出力(RING機能)
 
詳細な説明は割愛。4値までのなんちゃってベクタを扱える感じです。座標などを受け渡ししたかったので付け加えました
 現状ノードの代入機能でベクタは渡せないのであしからず


──────────────────────────────────
[変更点一覧]
◆RING保存データ形式の変更

 0.7.1のRINGは使えませんごめんなさい。(データ形式をだいぶ変えちゃいました)
◆RINGノードの全体的な挙動変更
 -コントローラー越しにRingDebugもできるように
 -TG系ノードはTICKで最初に値を要求された時点での値で同TICK間は固定するように(循環参照対策)
 -TG系ノードは通過時にも値を更新するように
 -TG系の例外時にはERROR値を返すように変更
 -ERROR値を受け渡されたDRは仕事をしないように
 -ifにERROR値判断を追加
 -Linkノードで循環参照を防ぐためにリンク深度(リンクのリンク)を最大5に設定
  (TG系と同じくTICK内で最初に更新されたリンク先で同TICK間は固定)
 -座席番号項目を全てRef可能に
 -キー入力DR・検知ノードに項目「シングル/ダブル」を追加
◆RINGの他ページ呼び出し時、呼び出し元情報を限定でstackする仕様に
 8呼び出しまでスタック。スタックオーバーフロー時は古い順から消えていきます


──────────────────────────────────
[0.7.3修正・追加要素一覧]
◆RING移動タスク「自由に徘徊」などのランダム目的地到達判定が場合によって不正となる問題を修正


[おまけ②:RINGサンプルいくつか]
※全てRINGを設置したユニットの設計図データなので設計図とコンストラクタに突っ込んでください

改めて俯瞰すると移動タスクchのクリアとかターゲットのクリアとかアトラクター処理とか色々足りないですが、そのうち追加していきます、、、

正式への格上げはもうしばらく様子見

──────────────────────────────────
フォーラム47ページ PostNo.300337
 
2014年1月22日
[RINGざらっと解説]
◆[基本の動作概念]
・RINGは0ページ0番から開始し、ノードを順番に実行していきます(順次実行)
 ノードは時計回りに矢印で繋がっていると思ってください(ごちゃごちゃするのでRING画面では省略していますが)
 1TICK内で処理できるだけのノードを処理します
  ×間違った理解 → 1TICKで1ノードを処理
  ○正しい理解  → 1TICKで複数ノードを処理
・標準のモードである「サイクル」だとページの最後まで到達すると同ページゼロ番に戻ります
 (時計回りに処理が続けられるイメージです。11時の次は0時になるように、ひたすら針は回り続けます)
 ただそれだけだと時計の針が延々と回り続けて処理が終わらず、CPUのリソースを無限に消費し続けることになりますが、
 下記のルールにおいてTICK内で処理が一時中断される制限を設けています
  -TICK内で規定数以上のノードを通ると一時中断。
  -TICK内で同じノードを二度通ると一時中断。
 次のTICKでは中断したノードから再開されます
 
 ※要約※
 RINGは時計回りの順次実行!
 TICK内で制限に引っかかるまで順番にノードを処理!
 RINGはTICKをまたいで実行され続ける!
 
──────────────────────────────────
◆[もっと具体的な動作のイメージ]
 まずはものすごい単純な例を書きます
 たとえば1ページ、ノードが6つあるRING(例1)があるとします
 
[(例1)RING構成]

  →①→
 ⑥   ②
 ↑    ↓
 ⑤   ③
  ←④←

 〔ユニットを起動してから最初のTICK〕
 Ⅰ.ユニットの内部処理がRINGを起動します
 Ⅱ.そのTICK内でノード①、②、③、④、⑤、⑥と順番に処理をしていきます
 Ⅲ.そのまま①にさしかかると①はこのTICK内ですでに通っているためRINGは一時中断されます。
 〔次のTICK〕
 Ⅰ.ユニットの内部処理がRINGを再び起動します
 Ⅱ.前回TICKは①で中断されていたので①から再開し、また①、②、③、④、⑤、⑥と処理します
 Ⅲ.前回TICK同様に①にさしかかると①はこのTICK内ですでに通っているためRINGは一時中断されます。
 〔以下略〕
 
 上記は分岐のない場合の単純なケースですが、次は分岐のあるケースです
 たとえば⑤のノードがジャンプノードで、条件によって③にジャンプするRING(例2)があるとします

[(例2)RING構成](例1とは別のRINGの話ですよ)

  →①→
 ⑥   ②
 ↑    ↓
 ⑤→→→③
  ←④←

 〔ユニットを起動してから最初のTICK〕
 Ⅰ.ユニットの内部処理がRINGを起動します
 Ⅱ.そのTICK内でノード①、②、③、④、⑤と順番に処理をしていきます
 Ⅲ.⑤では分岐条件によってそのまま⑥に進むか③に飛ぶかの選択があります
   今回は③へジャンプしたとしましょう。このとき本来ならば順番に処理されるはずの⑥、①、②は
   スキップ(順番を飛ば)されたことになります
 Ⅳ.RINGは③を処理しようとしますが、このTICK内ではすでに処理されているノードなのでRINGは一時中断されます
 〔次のTICK〕
 Ⅰ.ユニットの内部処理がRINGを再起動します
 Ⅱ.前回TICKは③で中断されていたので③から再開し、また③、④、⑤と処理していきます
 Ⅲ.再び⑤の条件分岐です。今回も全TICKと同様にジャンプ条件が成立し、③へとジャンプしたとします
 Ⅳ.RINGは③を処理しようとしますが、このTICK内ではすでに処理されているノードなのでRINGは一時中断されます
 〔以下略〕

 ※つまりジャンプノードでループさせ同じノードに飛ばすと、そこで次のtickまで休憩してしまうわけですね。 キーが押されるまでループとか作った場合も、1tick以上たってチェックする事になるので、R.I.N.G.の動きは結構遅くなりそう。

ちなみにマイクラの1tickは1/10秒だそうです。10tickで1秒 


───────────────────────────────────────
◆ノードの基本特性「すべてのノードは出力を持つ」

・「出力」って書いちゃうと何かを放出してるようなイメージですが「状態」のほうがイメージが易いでしょうか
 「いずれのノードも何らかの数値を抱えていて、他のノードに問い合わせを受けるとその値を返答する」
 それだけの話です


◆ノードの大まかな種類
・構文系ノード(ST:SyntaxNode)
・指示系ノード(DR:DirectionNode)
・検知系ノード(TG:TriggerNode)
※後ろの略称はあんまり気にしなくていいです。あるべが仕様を書き散らすときに使ってるだけなので
 (特にTriggerって呼び方は混乱のもとかも。ただステートノードだとSTで被るし。
  センサーだとセンサーノードと混同するし。。まあ呼び方はどうとでもです)

 ※要約※
 RINGは「構文」「指示」「検知」の三種類のノードで成り立っている!


◆[構文系ノード]
 ユニットやMCの動作とは関係なくRING自体の制御に関するノードです
 たとえば代表的なもので「IFジャンプノード」がありますが、RINGの流れを条件によって分岐させるノードです
 (たとえば本来であれば0,1,2,3..と順番に実行される流れを「2の次に3を飛ばして4や5へ」という風に
  文字通り先のノードへとジャンプさせるためのノードです。飛び越されたノードは実行されません)
 「もし(if)・・ならばスキップ(ジャンプ)する」ので「IFジャンプノード」です
 正直これさえ覚えておけば、他の構文系は必要になったらでいいと思います(変数系とか計算系とかは欲しくなったらで)
 
 ※要約※
 IFジャンプノードがあれば分岐が書ける!

───────────────────────────────────────
◆[指示系ノード]

 ユニットや(R.I.N.G.MCTRLが積まれた)ブロックに対して何らかの指示をするノードです
 ノードリストでは上のほうに集まっているノード群です
 たとえばユニットを前後に移動させたり、ローテーターを回したりなどの指示が可能です
 逆に言うとRINGはこの指示系にある処理以外のことは何もできません
 (今のところアトラクターなどが対応ノード未実装なので動かせないかな。。)
 指示系ノードには「チャンネル」という概念が絡んでくるのですが、、、
 ひとまずは「特定のMCTRLとノードを結び付けるキーのようなもの」の理解で大丈夫だと思います
 具体的にチャンネルが何なのか理解を深めたい方は項[チャンネルについてもっと詳しく]を読んでみて下さい。

 ※要約※
 ユニットやブロックへの指示は指示系ノード!

───────────────────────────────────────
◆[検知系ノード]

 ユニットやMCワールドの状態を認識して値を出力するノードです
 リストでは下に集まっているノード群で、クエスチョンマークの添えられたものは全て検知系のノードです
 基本的には通っても自分の値の更新意外は何の処理も実行されません。値の出力だけを担う専門家です
 一番わかりやすいものは「キー状態検知ノード」でしょうか
 指定したキーが押されてるかどうかで「出力」が変化するノードです
 特に構文系ノードの説明で取り上げた「IFジャンプノード」と組み合わせることで真価を発揮します
 キー状態検知ノードにIFジャンプノードをつないでやることで
 「キーを押されているとき以外は回転処理をスキップ(ジャンプ)」などの機能を実現することができます

 ※要約※
 状況判断は検知系ノード!

───────────────────────────────────────
◆[各ノード種類が具体的にどんなケースで使われるか]

 たとえば「座席に人が座っているときだけローテーターを動かす」という処理をRINGに記述するとして
 「座席に人が座っているとき」というのを検知ノードが担い
 「だけ」を構文系ノード(具体的にはIFジャンプノード)が担い
 「ローテーターを動かす」を指示系ノードが担うことになります

───────────────────────────────────────
◆[ノードの設定項目で「R」とか「F」とか切り替えられるのは何?]

・F:Fixed:つまり「固定値」です
 ユーザーの入力した値がその項目での設定値になります
 こちらは各MCTLの設定でもお馴染みですね
 (ローテーターでXの初期値に90を設定←こういうのと同じです)
・R:Reference:つまり「参照値」です
 参照とはつまり「見る」こと。→他のノードの出力を見に行ってその値を使うことです
 (あるべも「あちらを見てください」を「あちらを参照ください」みたいに言いまわすことがよくあるもよう)
 ユーザーの入力した値ではなく、他のノードが出力した値をもって処理を行うということです
 この方式の強みは「プログラム実行中に値をころころ変えられること」に尽きます(「値が動的である」とか言ったりします)
 主に検知ノードなどが出力した値を参照することになると思います

 ※要約※
 F:固定値とは「ユーザーが入力した値を使わせる」こと!
 R:参照値とは「(他のノードの出力値を)見に行く」こと!

───────────────────────────────────────
◆[Rでいちいちノード番号入力するのめんどくさい!]

・右クリック→ドラッグで引き出せる線を参照先のノードに引っ張ることで参照先IDX番号を設定できます
 ノードにRef可能項目が複数ある場合は線を引き出した状態で左クリックで項目が切り替わります
 
 ※要約※
 右ドラッグで線を繋げる!項目の切り替えは線を出した状態で左クリック!

───────────────────────────────────────
◆[その他ちょっとこまごました話]

◆[真偽値って??]
 よく「コンピューターは0と1で動いている」と言われたりしますが
 この0と1を「そうでない」「そうである」という概念にあてはめて「真偽値」などと呼んだりします
 一般的には
  0(:false)は「違う」こと。偽、否、違う、そうじゃないこと
  1(:true)は「合っている」こと。真、可、合致、そうであること
 という風に扱われます
 プログラムの世界ではこの通念が拡張され、たとえば整数世界では
  0:false
  0以外の数:true
 というように0のみを「false(偽)」として扱い、それ以外なら「falseではない=true(真)」と扱ったりします
 RINGもこの「0以外はtrueとして扱う」というルールを採用しています。この場合、当然「1」もtrueです

◆[ベクタ??って??]
・無視してOK!
 よほど変わったことをするのでなければV1とかV2とかベクタとかVectorとか書いてあるのはスルーで大丈夫です
 代入ではベクタが使えないなど実装も中途半端ですし、4値のベクタ計算実装してませんし、
 はっきり言ってあるべの自己満足領域です

◆[チャンネルについてもっと詳しく]
・ある特定の機構に処理を実行させるにあたり、どのノードに処理をさせるか判別するための仕組みです
 チャンネルを解することで機構は実行のタイミングでどのノードに従って更新処理などを行うかが解ります
 実行するときにひとつの要素に対して複数のノードが競合しないようにする仕組みでもあります
 ターゲット検索などの重たい処理もチャンネルを解することでtick内に一機体で複数回実行できないよう制限する役目も
 もっとイメージを掴みたい方はDROPBOXのDEVフォルダにある概念図をご参照ください

アクションチャネルとモーションチャネルは、同じR.I.N.G.チャネルMCTRLを使ってるけど別物なのね。あとチャネルは強制的にchクリアノードで消せるけど、ターゲットは消せない。。。。不便



───────────────────────────────────────
◆[RINGを作っていくときひかっかりそうなところ]

・Q「ショットモードが途中で止まるんだけど。。」
 ショットモードは「毎TICK必ず0ページ0番から始まる」わかりやすいモードですが
 基本ルール「定められた数以上のノードを通ると中断」から逃れるものではないため
 TICK内で非常に長い処理を行わせようとすると最後まで辿りつけない場合があります
 基本的には「毎TICK絶対に行わせたい処理がある」というケース以外では推奨しません
 また分岐処理などで同じノードを二度通ろうとしても終了するため、かなり処理内容は制限されます

・Q「指示系ノードが動かなくて、RingDebugで見てみると「err」を出してる。。。」
 指示ノードの入力として参照したノードが「err」を出していませんか?
 たとえば座席状態検知ノードで誰も席に座っていないのにその状態を問い合わせたりすると「err値」を返します
 err値を参照した指示系ノードはチャンネルへの登録自体に失敗するので動作しません
 参照先の検知ノードなどが「err」ではないちゃんとした値を出力しているかどうか確認しましょう
 RINGにはいわゆる「例外系」はないので、かっちりとした処理を組むには適切に「err」値をハンドリングすることが必要です

・Q「思ったとおりに動かなくて、RingDebugで見てみるといくつかのノードが空ノードに置き換わってる」
 RINGのページ設定画面で「権限」のチェックがいくつか外れていませんか?
 一括で特定グループの指示を無効化するための仕組みで、権限に適合しないノードは実行前に空ノードに変換されます

・Q「座標はわかるけどEntitIDって?」
 Entityの個体を識別するMCの内部IDです。たとえば豚が二匹いた場合、それぞれにユニーク(かぶらない)な値が振られます
 基本的にMCによって生成順に一匹にひとつIDが振られ、セーブ&ロードなどを挟むと同じ個体でもIDは変わります
 
 似たようなものにBlockIDがありますが、これはEntityIDとは別に「ブロック種別」に与えられた番号で、ワールドごとに固定です
 (セーブ・ロードを挟んでも変わらないが、ワールドが異なると同じ種類のブロックでも値が違う可能性がある)
 このあたりの一意性・一貫性・IDの有効サイクルなど理解していないと思った動作にならないことがあるのでご注意ください
 (たとえばRINGでゴールドブロックのIDを割り出して書き留め、それを地下から検索するようなRINGを組んだとしても、
  他のワールドにそのRINGを持ち込むとIDが変わっていて動作が異なる、というミスが予想されます)

・Q「いわゆる再帰処理を組んだんだけど、思ったとおりに動かない。。。」
 ごめんなさい、他リングの呼び出し過程は8呼び出し前までしか記憶できません
 (プログラムごとにセーブ時の実行状態を保存するのにある程度の枠を設けなければならなかったため)
 末尾再帰化できる再帰以外はたぶん書けないと思います
 ※あ、8呼び出しまでなのね。ということは巻物みたいに、
  入れ子にしてずっとつなげることは出来ないんだ。

・Q「つまりRINGって、あるTICKでどこから始まるか、どこで終わるか不定ってこと?そんなの不安定すぎじゃ。。。」
 そうです
 なので処理が長くなればなるほど「必ずしもTICK内で実行されないノード」が増えることになります
 ある程度制御をはっきりさせるテクニックとしては、たとえば「1ウェイトノード」を任意の処理の前に置けば、
 必ずそこでTICKの処理が中断され、次のTICKはその次からのノードから開始されることが保証されます

・Q「ひょっとして検知系ノードって通らなくてもいいんじゃ。。。」
 よくそこに気付きましたね!
 他ノードからの問い合わせでも値を計算して返すので通らなくても機能します
 固定ジャンプですっとばしたら実行ノード数の節約になります
 ただRingDebugで見るとき問い合わせされない限り値が更新されないのでちょっと不便かもです
 ※あ、通らなくていいのね。最近通してないけど。デバッグのときは更新されないんだ。

──────────────────────────────────
[おまけ②:RINGサンプルいくつか]
※全てRINGを設置したユニットの設計図データなので設計図とコンストラクタに突っ込んでください

「ローテーター順次回転」
ローテーター(とエクステンダー)を計画にそって動かす、というサンプルです
BR+LCAAAAAAAAAB1ks1OwkAQx6f0g3X5PBAuJmg8eeRMOBlDAgdC4tfRbNulNO62pruo76IP4WP4
FD6BPgNOF0pBdA6Tf2Z+O7OZGQpQA1vxDACOV2gWrK1lowvhH7OAoD+x2wPDuH8AUAG6y3ibTBia
qjbYQSJzEhXfKiWKbGJiuZpLjaKDKtty2ig7f7HmquAqrX2B8jxnsOupTMPJ/SSNE30h0uBhkMVJ
FCxkquM0iTWXBJyESQ7eJUsCnlFwA0TmNtSVYE/8SqR6ujQdLWgwpbj0BR8JFqkKAbLEGtOd5xY0
/ZRl4W3Mnw2Ef/dyaByuJ9IRLIv4DUbueBwt9Ch+4WFYBSd77PeR+KZdy4y/lTtnZezz7fWrZ7WH
3TOCY6ZmpsZmxg8dgpUPsqv3Ilux0XvQKZlfy0LG9WDY7lFcEcVrgI8iXiVl3CquAeNHdK/jbL9a
rV5mrYNejebmPw4QqfxrFo3LK8vXGYiNYjozwR9PL8cpowIAAA==
10tick動かして(動いてる間はTRUEなので、IF-STでロテDRに戻してる。)
途中20TICKウェイトSTで止めて、エクステンダーも同じように11TOCKうごかして
を繰り返す




「視線でロックオン」

視線追従の先につけたセンサーの射線から3番ターゲットを更新していく、というサンプルです

BR+LCAAAAAAAAACFksFu1DAQhsd2wqbptk3LwgWJLqqQqARVDz0tORVRqT30AKEcKydx02idpIpd
oLwFEjd4DJ6HJ+AZGsZOQlMoWh9W/8z++cb+bR9gGZgSNQB8aXARaNcaw58U7lwEGnCMZ6MtGTSN
rfdsTV3keCg2o+ARMnwg5AWQWwjqkM7z+r8eQqEhlrtla7ft3bE32209OJssmO3ibLJoNnJgAYcg
BxZwbFpOv2cTNtBhPQZgw3qFAmv3thU8QOYz8z0iswFwFT3UN56nwUubQzfTeZ72qYzdppsT2Tpw
r2l/HsPdNnMJ/Bhy1+k1JX6f9zDf9A93Az3Ug2Cn25/fn7FfDFhSFmBfBRNWUVRKpt2/pe2NUJ0V
GtUEVW17S6i0VaanWsoIXKV1LFF/NUfEpJ8UVXp0elTlpd6XVTKfFTw5z0tRVDqvylyLAmOZ/m1S
olRVPfDswGbr2X9TxZWeYSHkqeSfRZ1xLfMywxP+g5mLq1qoG4wHTskLAUsRL+fT6OpC+OAmdV6e
MRgryT+It7LSx5dFG9MKV0oUsRQHkmcKb8S7RMzxbQKB1bjidXqSi4+tj8E94zs0IVICE8nrTLzD
znuRZ+f6IP8k0nQETn2xu4uWV/5DYq9kzT6Lxq6f37/9ekxYuDwjMDX9iR+GzgnSwvshszdJBo/X
Aa9QccSzw5uXYK4lkZ3iurbN3x9oQnFDBAAA
あ、やっぱセンサー状態TGはノード1を参照せず、センサー直でいいのね。
センサー1に動物を探させて、センサー1の情報を検索結果0に入れて、ターゲット3にそのEntity情報を入れてる。
銃口はRINGからじゃなくて、ロテタのモーションを直接「ターゲットへ回転 ターゲット3」にしてる。
これ楽だな。てか回転DRの必要ない?あ、RING内だと色々条件付けれるか。






「絶滅ヘリ」

座席にMOBを乗せた状態でエネルギーが充填されると軌道位置周辺を徘徊して
座席に乗ったMOBと同じ種類のMOBを攻撃しエネルギーが減ると起動位置に休みに行く、というサンプルです
※燃料が必要です
BR+LCAAAAAAAAACFVMtO20AUvWOPY+MkJICpKlUKVH0sUeR2UUWWeAkkUIsQobRdIcceEgs/kD0U
1L/orq/P6E/0J7rptot+Ae6dsROStMBdWOeeOXNfM2MToApqxlIA+JijESisoeLHhxuMgPI/DVFG
EJdyKjS2dHGBFL42XFbGfYRqbiBY0poPMKYFhBCYNFTS3BQatdmRebVyxfeHVVSQvEujqaBeCU3j
+VT9YxoFS5SaJzdrtFyVuRrdmzWUlJqtGzVUy8tZdKVf064m/LpypYCczaOyJwWmbRY1hEJzZaRR
/9FQSsq4m9JvUmXCn1OUO/PMo+bWPDhbL44QEERMogqiLPTL1VhyM4hOIo7IQpRKTkXEJRJcVkTR
Qcs474WIz4QGb8fDKPF3j3eTIOYbYeKddiLXGwQxixIeJHHAWYSlLU+L0iDue4MxzQosFZqNg6SX
8A46LDwO3Q8s7bs8RLkBNHYjBubWJQ9iD3emJmgeRjpRoZaF7nvWDRO+dy4qxTdRd7OMRb2QbYdu
P1MMMM4x1d5UCAKzvcRN/aOAXUghTqUihDtynASs0E377DUyb1jQH/Dt4JL5vg40PWu38VA+mfc0
+TYa8lRzaT+/ff3dIk270R0kCe8ylzP/lRvEjk5Bih26S8B2qEEaLUEqBWmoDRCuWrpaHd12i4p+
nGoHbwkiYprHDq0Iih7h8TgLDpGvwxx7o7i51rBwQYSjkiHQIqY902V8PYv2k0xkN8CpzcPqn3JX
LiOaglsrKVJwNck1J7hZyd0fcQsOxV+FnBq+NfHRiWNeX9sWqdvVA5bxne2XycVWjAVUdHCUfdtZ
tOiwCLL2blRNs4VHjL1hLKWY26I1PxKu/vgs7Iso26BVa6oVvW0Wg5vY8+uZNFwXxS+XdAXrHG0V
U5soe8aubw6Yd3rY50duGPhO5a0I3MK0oBdfq+RMzNZcM4atvLgerEF1uDWLbpv7aeKtc+56p+Mp
NEv0QmQvc49BMQVC93sRR38q7guZDkjBiLLeodvfuf7RiZfshSVyeSrJvxNmbw52BgAA





──────────────────────────────────

こーしんりれき

2017.6.1 表題の名称を変更(旧名:Ringについての考査)


広告
他28件のコメントを表示
×
キー入力指示ノードで変な動きがある。
シートに載っていない場合は動かない?
シートをインターフェースにしてても、コントローラーでアセンブルしないと動かない。

4ヶ月前
×
ウェポンセレクタなどの順次確認する必要のあるルーチンは、各アクションをするごとに1回巡回させないといけない。
タイミングが難しい。
4ヶ月前
×
基本的なサブルーチン郡

トリガー系が欲しいね。
汎用キーxを押した時~
汎用キーxを押している時~
汎用キーxが押されてない時
みたいな
4ヶ月前
×
クールタイム有るといいよね。
あ、指示ノードの出力先を適当に127チャネルとか使ってないのにしてやれば0/1でカウントさせれるか。
4ヶ月前
×
汎用キーを押されてる間ループさせると、他の処理が止まるので
処理中に他の処理をする方法はないか。

例えば、射撃ボタンが押されている間弾を撃ち、離すとやめループなど。
押した時と離した時で真偽を反転させるなどしてループを変えられないか。

最初に各汎用キーの入力状態をチェックして、それぞれ用の変数STに状態を入れる。
4ヶ月前
×
変数ノードで指定したページを読みに行く。

指定キーを押してない時、
指定汎用キーを押すと、変数ノードを+1し、
押している間、変数ノードを変更させない。
4ヶ月前
×
アセンブル時の座標を記憶しておいて、特定の指示でその座標に戻ってくるR.I.N.G.
4ヶ月前
×
遅延発射R.I.N.G. 射撃キーを押すと、数Tick溜めモーションをしてから発射する。
ウェイトSTを入れてとか、溜めモーションが終わるまでループするとか。
射撃中も移動系R.I.N.G.は動かしたいので、別R.I.N.G.にするのがいいのかも。

ところで、4つあるR.I.N.G.はチャネル共有?
ユニット毎にきまってるんかな。
4ヶ月前
×
アトラクターを介した、スレーブのR.I.N.G.ってどんな動きをするんだろ?
例えばターゲットやセンサー、チャネル、Entityデータなんかはマスターの一部として扱われるのかな。
それっぽいこと書いてあったと思うけど。。。。
3ヶ月前
×
>>38
移動指示DRなんかはたぶん、スレーブR.I.N.G.に入れてあってもマスターは動かないと思う。
なので、アトラクターをオフにしたら相手を追っかけ、倒したら戻ってくる、見たいなのができると思う。
ターゲット自体はマスター側のターゲットサークルから指定してとか、距離によりーとか・・・
そもそも切り離した後、ターゲット情報が消える可能性があるので、
その場合、スレーブR.I.N.G.に近くの敵を探させるようにするのがいいかな。
3ヶ月前
コメントを書く
コメントをするには、
ログインして下さい。