Unreal LED、たたはUnreal Tournamentの負荷制埡

アむデアは冗談のように芋えるかもしれたせんが、それは生きる暩利に倀したす。 私たちは、仮想珟実から倖郚ぞ、぀たり仮想の珟実ぞの通垞の耇補ずは反察の方向に、むベントをコピヌするこずに぀いお話しおいる。 私はそれを「拡匵珟実リバヌス」ず呌びたす。 その考えは、HTTPリク゚ストをArduino Ethernetシヌルドに送信するこずです。 UTから。



むントロ



おそらく、むヌサネットモゞュヌルたたはシヌルドのすべおの賌入者が* duinoからLEDをオンにする*サヌバヌを䜜成し、倚くの人が遅かれ早かれそれをAndroidスマヌトフォンのようなクラむアントに瞫い付けたした。 最近、私は考えおいたした-アンリアルトヌナメントをこのクラむアントずしお䜿甚しおみたせんか UTは優れた芖芚化環境であり、さらに、゚ンゞン自䜓は非垞に䟿利で柔軟です。



むンタヌフェむスレベルでの゚ディタヌの知識は十分です。 UnrealScriptの゜ヌスは、クラむアントが蚘述しおいる方法に沿っお説明されたすが、䞀般的にUnrealScriptには通垞のシステム構文ず非垞に理解しやすい関数名がありたす。 Unreal Editorを初めお芋たが、ただ詊しおみたいずいう方は、 VBKesha Introducing UnrealEngineの蚘事を読むこずをお勧めしたす。 第1郚 、率盎に蚀っお、私自身はこのコヌスを続けるこずを本圓に楜しみにしおいたす。なぜなら、たずえばネットワヌク耇補では、私は完党な男だからです。 UT99甚に䜜成されたすべおの歊噚は、シングル/オフラむンモヌドでのみ正しく機胜したす。



サヌバヌ



䞀般に、読者はArduinoでWebサヌバヌを䜜成する問題に関するすべおをすでに知っおいるず想定されたす。 それにもかかわらず、繰り返しは孊習の母であるため、念のために、この䟋のバリ゚ヌションの1぀を匕甚したす。



サヌバヌの説明
ハヌドりェアはENC28J60のむヌサネットモゞュヌルたたはシヌルドで衚され、Dr。Dr.WebのEther_28J60ラむブラリがスケッチの䜜成に䜿甚されたす。 修道士 。 これは、 Nuelectronicsラむブラリのラッパヌです。 ここずここ からアヌカむブを arduino\ librariesディレクトリに展開し、WebRemoteの䟋を取り䞊げお、必芁に応じお倉曎し、スキヌム別のモゞュヌル甚に埓っおアセンブルしたす。

ボヌドENC28J60 Arduino
SI MOSID11
そう 味ISOD12
SCL SCKD13
Rst リセット
5V 5V
GND GND
CS D10
ArduinoのD6ピンにはLEDがあり抵抗噚を介しお、アノヌドプラスが二重に、カ゜ヌドがグランドに向かっおいたす。



私のスケッチは次のようになりたす。

#include "EtherShield.h" #include "ETHER_28J60.h" int outputPin = 6; static uint8_t mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; static uint8_t ip[4] = {192, 168, 0, 40}; static uint16_t port = 80; ETHER_28J60 e; void setup(){ e.setup(mac, ip, port); pinMode(outputPin, OUTPUT); } void loop(){ char* params; if (params = e.serviceRequest()){ e.print("<H1>Web Remote</H1>"); if (strcmp(params, "?cmd=on") == 0) digitalWrite(outputPin, HIGH); else if (strcmp(params, "?cmd=off") == 0) digitalWrite(outputPin, LOW); e.print("LED state: <br>"); if(digitalRead(outputPin)==1) e.print("on"); else e.print("off"); e.print(".<br>"); e.print("<A HREF='?cmd=on'>Turn on</A><br>"); e.print("<A HREF='?cmd=off'>Turn off</A>"); e.respond(); } }
      
      





ディスク



リク゚ストを完了するには、実行時にパラメヌタを枡すこずができるクラむアントクラスが必芁です。 幞いなこずに、このようなクラスはすでに存圚し、UBrowser.UBrowserHTTPClientず呌ばれたす。 UT2003 / 2004にはUBrowserパックはありたせんが、UWeb.WebApplicationずそのサブクラスがありたす。 UT99からリク゚ストを送信するこずを怜蚎しおください。叀いバヌゞョンの堎合は、類掚によっおそれをシャヌプにするこずができたす。 UBrowserHTTPClientはGETリク゚ストのみを行うこずができたすが、それを教えおPOSTするこずができたす。 実際には、䞀般にHTTPヘッダヌを任意の方法で倉曎し、HTTPプロトコルだけでなく他の方法も実装できたす。



UBrowserHTTPClientにぱディタヌメッシュたたはテクスチャスプラむトに芖芚的な衚瀺がありたせん-レベルに远加するず、そこに衚瀺されたすが、゚ディタヌには衚瀺されたせん。 したがっお、より䟿利な「ラッパヌ」を䜜成するず同時に、レベルで線集できる倉数のペアを提䟛したす。 芪スヌパヌクラスずしお、トリガヌクラスを䜿甚したす。



ここで、 VBKeshaの蚘事で説明されおいないこずを続けたす。 ビュヌのあるワヌクスペヌスの䞊にブラりザ呌び出しボタンがありたすこれらは次のようになりたす  Actor Classesに興味があり、ポヌン最初のボタンに䌌たボタンで開きたす。 このりィンドりにチェックボックスのある䞋郚フィヌルドがない堎合は、メニュヌの衚瀺->パッケヌゞの衚瀺コマンドで有効にしたす。 有効にする必芁がありたす。独自のスクリプトパックを䜜成するため、必芁になりたす。



アクタヌクラスブラりザヌ クラス䜜成



芁求を管理できるテストトリガヌを䜜成するには、このりィンドりでTriggersグルヌプを開き原則はWindowsレゞストリ゚ディタヌず同じです、 Triggerを遞択しおボタンを抌したす 。 衚瀺されるりィンドりの䞀番䞊の行は䜜成䞭のクラスのパックファむルの名前で、䞀番䞋はクラス名です。 したがっお、Enterキヌを抌すず、MyPackage.MyTriggerクラスが取埗されたす。 単玔なstdHTTPTrig.stdHTTPTriggerを呌び出したした。 次に、コヌド自䜓を蚘述したす。



 class stdHTTPTrigger expands Trigger; var() string BrowseURL,BrowseArg; function Touch(actor Other){ local UBrowserHTTPClient uhc; foreach allactors(class'UBrowserHTTPClient',uhc) uhc.destroy(); uhc=spawn(class'UBrowserHTTPClient'); if(uhc != none) uhc.Browse(browseurl,browsearg); }
      
      





スクリプト゚ディタヌ゜ヌスを蚘述する堎所は、クラスをダブルクリックしお開き、クラスを䜜成するず自動的に開きたす。 コンパむルはボタンで行われたす 倉曎されたスクリプトをコンパむルするりィンドりの䞊郚。 [すべおコンパむル]をクリックするこずはお勧めしたせん。最初はUEが長い間考えおから、䞀郚のクラスが芋぀からないずいう䞍満を蚀いたす必芁なものだけが読み蟌たれるため。 3本の指で撮圱したす。 コンパむル埌、パックを保存する必芁がありたす。このため、アクタヌクラスりィンドりの䞋郚にその名前[パッケヌゞ名]行に蚘述されおいるものを芋぀け、その前にフラグを付けお、クリックしたす。 。 ちなみに、゜ヌスをすばやく修正しお保存する必芁がある堎合は、クラスブラりザりィンドりを開くず䟿利です。 スクリプト゚ディタヌを終了するこずなく埌者がフルスクリヌンに展開されおいる堎合。



ご芧のずおり、考慮されるトリガヌはかなり倱瀌です。レベル内のすべおのクラむアントのアクタヌをすべお砎棄しメモリを節玄するためだけ、新しいアクタヌを䜜成しお、指定されたリ゜ヌスを調べたす。 browseを呌び出した埌、クラむアントは砎棄されたせん。動䜜に時間がかかるためです。 browseメ゜ッドには、TCPポヌトずタむムアりトの2぀のオプションパラメヌタがありたす。 埌者を䜿甚するず、リク゚ストの成功を远跡し、リ゜ヌスの可甚性を評䟡できたす。 たた、このクラむアントには、サヌバヌの応答ず゚ラヌ凊理を返すためのコヌルバック関数がありたす。 この機胜を䜿甚するには、これらの関数をオヌバヌラむドする必芁がありたす。぀たり、独自のサブクラスを䜜成し、その芪はUBrowserHTTPClientになりたす。



テストレベル1






テストルヌムは、1぀のPlayerStartず光源の2぀のトリガヌで構成されおいたす。 BrowseURLプロパティは䞡方で同じです-これはサヌバヌのIPアドレスです。 BrowseArgは、リ゜ヌスの名前スラッシュ/ずデヌタ疑問笊ず倉数で構成されるパラメヌタヌです。぀たり、䞀方には/Cmd = onがあり、他方には/Cmd = offがありたす。 プロパティりィンドりは、オブゞェクトのRMBで、たたはプロパティで、たたはF4で開きたす。 F4が抌されおいない堎合は、任意のビュヌを巊クリックしたす。 郚屋を描いたら、F6キヌを抌したす。開いたりィンドりレベルプロパティで、LevelInfoが芋぀かりたす-DefaultGameType。 singleplayerに倉曎しおEnterキヌを抌したすUnrealShare.SinglePlayerが眮き換えられたす。そうしないず、ボットが衚瀺されお干枉したす。 次に、レベルを構築しゞオメトリの再構築、保存しお実行したす。 トリガヌに埓っおブラスタヌから撃ちたすデフォルトではアクションの半埄は40です。







サヌバヌの応答を取埗する



ここで、䞀般的な甚語でアむデアを確認した埌、フィニッシュラむンの開発に進むこずができたす。 同じ方法で新しいクラスのパックに名前を付ける予定で、叀い「オヌク」トリガヌが必芁ない堎合は、゚ディタヌを終了しお、ut99\システムディレクトリにあるpackname.uファむルを凊理したすパック名は、クラスでパックず呌ばれるものです、ut99-Unreal Tournamentぞのパスたずえば、叀いディレクトリに移動したす。 たたは、必芁ないのですぐにバスケットに入れたす。 ゚ディタヌを再び起動したす。



レベルむベント



U゚​​ンゞンには、適切なプロパティを持぀すべおのアクタヌを順番にバむパスし、適切な関数を呌び出すこずを陀いお、むベントを䜜成するための他のメカニズムはありたせん。 トリガヌのすべおのタむプで、Tagプロパティがこれに䜿甚されたす-タむプ名オブゞェクト名の倉数ず、トリガヌ、トリガヌ解陀関数。 Untriggerは、たずえば匕き戞でのむベントの「砎壊」の効果を目的ずしおいたす。 開口郚の䞭倮に、ドアを圢成するムヌバヌムヌバヌ、たたは移動可胜ブラシ-移動ブラシたたはブラシのTagプロパティで指定されたむベントを䜜成するトリガヌが蚭定されたす。 プレむダヌがトリガヌの範囲に入るず、ムヌバヌはTrigger関数を呌び出し、半埄を離れるずUntrigger関数が呌び出されたす。 その結果、プレむダヌがトリガヌの範囲内にいる間のみドアが開きたす。 レベルの構築における䜿いやすさず互換性ずいう2぀の目暙を远求したす。



この䟋では、実際には、オン/オフ状態のみがチェックされたす。 これは、文字列内の郚分文字列を怜玢する条件ず機胜を䜿甚しお行われたす。 ただし、サヌバヌの応答から特定の倀、たずえばRGB LEDのPWMレベルを匕き出す前に、このシステムの開発を劚げるものはありたせん。 ただし、RGB LEDにはRGB圢匏のデヌタが必芁であり、Unrealでは色をHSBに倉換する必芁があるこずに泚意しおください。



新しいトリガヌには、サヌバヌ応答で怜玢する必芁のある8぀の文字列のサンプルず、文字列が芋぀かった/芋぀からなかった堎合にむベントを䜜成/砎棄するための同じ数の名前が含たれたす。 必芁に応じお、増加、削陀などを行うこずができたす。HTTP゚ラヌの堎合、むベントの䜜成のみが提䟛されたす。この堎合、Untriggerを䜿甚する必芁はありたせん。 繰り返したすが、誰も远加を犁止しおいたせん。



クラスブラりザActor Classesを開き、その䞭でグルヌプActor \ Info \ InternetInfo \ InternetLink \ TcpLink \ UBrowserBufferedTcpLinkを開き 、クラスUBrowserHTTPClientを遞択し、ボタンをクリックしたす 新しいスクリプト。 クラス名ずパックを指定しお、コヌドを蚘述したす。



 class stdHTTPBrowser expands UBrowserHTTPClient; var string SearchRespData[8]; var name SearchRespEvent[8]; var name SearchNotInRespEvent[8]; var name SearchRespCancelEvent[8]; var name SearchNotInRespCancelEvent[8]; var int HTTPErrCode[8]; var name HTTPErrEvent[8]; event HTTPReceivedData(string Data){ local int i; local actor a; for(i=0;i<=7;i++){ if(SearchRespData[i] != ""){ if(InStr(Caps(Data),Caps(SearchRespData[i])) != -1){ if(SearchRespEvent[i] != '') foreach allactors(class'Actor',a,SearchRespEvent[i]) a.Trigger(self,self.instigator); if(SearchRespCancelEvent[i] != '') foreach allactors(class'Actor',a,SearchRespCancelEvent[i]) a.Untrigger(self,self.instigator); }else{ if(SearchNotInRespEvent[i] != '') foreach allactors(class'Actor',a,SearchNotInRespEvent[i]) a.Trigger(self,self.instigator); if(SearchNotInRespCancelEvent[i] != '') foreach allactors(class'Actor',a,SearchNotInRespCancelEvent[i]) a.Untrigger(self,self.instigator); } } } } event HTTPError(int Code){ local int i; local actor a; for(i=0;i<=7;i++){ if(HTTPErrCode[i] == Code && HTTPErrEvent[i] != '') foreach allactors(class'Actor',a,HTTPErrEvent[i]) a.Trigger(self,self.instigator); } }
      
      





型名IMHOは、䞭囜語、ロシア語などの文字列にロヌカラむズされた文字列があるこずを陀いお、文字列ずそれほど違いはありたせん。ただし、チェックする条件では、空の名前は ''単䞀匕甚笊で、空文字列は「」二重匕甚笊です。 キヌワヌドむベントは、Windows APIの゜ヌスコヌドのコヌルバックず同じです。 芁するに、コヌルバック、぀たり、関数はクラススクリプトではなく、倖郚むベントによっおトリガヌされたす。



コメントを予想するこずは、Boのショップの「穎に入った」に䌌おいるため、Add YourHTTPClientClass hereコマンドを䜿甚しおこのクラスをレベルに远加しないこずを嬉しく思いたす。 トリガヌ内のspawn関数がこれを行いたす。 私の意芋では、これはそのようなものに最も適したクラスです。 したがっお、スクリプト゚ディタヌりィンドりを閉じ、クラスブラりザヌでグルヌプActor \ Triggersを開き、 Triggerを遞択したす。 [新芏スクリプト]をクリックしお、トリガヌコヌドを蚘述したす。



 class stdHTTPTriggerX expands Trigger; var() enum EHTTPTriggerLaunchType{ // launch type HTTLT_Touch, HTTLT_Trigger } HTTPTriggerLaunchType; var() string SearchRespData[8]; // search template in HTTP response var() name SearchRespEvent[8]; // events generated on match var() name SearchNotInRespEvent[8]; // events generated if no match var() name SearchRespCancelEvent[8]; // events cancelled on match var() name SearchNotInRespCancelEvent[8]; // events cancelled if no match var() int HTTPErrCode[8]; // HTTP error templates var() name HTTPErrEvent[8]; // events generated if defined HTTP error(s) ocurrs var() string BrowseURL,BrowseArg; // URL var() bool bAutoExec; // enable auto launch var stdHTTPBrowser hClient; // client handle function CreateClientRequest(){ local int i; if(hClient != none) hClient.destroy(); // destroy previous request hClient=spawn(class'stdHTTPBrowser'); // create if(hClient != none){ for(i=0;i<=7;i++){ hClient.SearchRespData[i]=self.SearchRespData[i]; // transfer configs hClient.SearchRespEvent[i]=self.SearchRespEvent[i]; hClient.SearchNotInRespEvent[i]=self.SearchNotInRespEvent[i]; hClient.SearchRespCancelEvent[i]=self.SearchRespCancelEvent[i]; hClient.SearchNotInRespCancelEvent[i]=self.SearchNotInRespCancelEvent[i]; hClient.HTTPErrCode[i]=self.HTTPErrCode[i]; hClient.HTTPErrEvent[i]=self.HTTPErrEvent[i]; } hClient.Browse(browseurl,browsearg); // launch } } function Trigger(actor Other,pawn EventInstigator){ // triggered launch if(HTTPTriggerLaunchType == HTTLT_Trigger) CreateClientRequest(); } function Touch(actor Other){ // proximity launch local actor a; if(IsRelevant(Other) && HTTPTriggerLaunchType == HTTLT_Touch){ if(ReTriggerDelay > 0){ if(Level.TimeSeconds-TriggerTime < ReTriggerDelay) return; TriggerTime=Level.TimeSeconds; } CreateClientRequest(); if(Message != "") Other.Instigator.ClientMessage(Message); if(bTriggerOnceOnly) SetCollision(False); } } function PostBeginPlay(){ // autoexec launch if(bAutoExec) CreateClientRequest(); }
      
      





ここでは、このトリガヌによっお䜜成されたクラむアントオブゞェクトのみが砎棄されたす。 これにより、耇数のクラむアントが同時に動䜜できたす。 キヌワヌドnone-オブゞェクトの空の名前。オブゞェクトが䜜成されたかどうかを確認できたす。 self-自分のオブゞェクトの名前。自分自身を参照できたす。 自己衚珟。 倉数名の前に蚘述するこずはできたせんが、これによりコヌドがわかりにくくなりたす。 varの埌の括匧は、この倉数がアクタヌプロパティりィンドりに衚瀺されるこずを瀺したす。 ぀たり、クラむアントクラスにはこれらのプロパティがありたすが、スクリプトからのみ線集できたす。これを行うCreateClientRequestにはルヌプがありたす。 IsRelevantは、そのプロパティずの互換性を確保するためにEngine.Triggerクラスから借甚されたす。 ReTriggerDelayの条件により、指定した間隔よりも頻繁に操䜜を制限するこずはできたせん。



コンパむルスクリプト゚ディタヌで倉曎されたスクリプトをコンパむル、ブラりザヌにパックを保存したす。



倉数の説明

HTTPTriggerLaunchType 打ち䞊げタむプ
SearchRespData [] 怜玢テンプレヌト
SearchRespEvent [] パタヌンが芋぀かったずきにトリガヌされるむベント
SearchNotInRespEvent [] テンプレヌトが欠萜しおいるずきにトリガヌされるむベント
SearchRespCancelEvent [] テンプレヌトが芋぀かったずきに砎棄されるむベント
SearchNotInRespCancelEvent [] テンプレヌトがない堎合に砎壊されるむベント
HTTPErrCode [] HTTP゚ラヌコヌド
HTTPErrEvent [] HTTP゚ラヌによっおトリガヌされるむベント
BrowseURL サヌバヌアドレス
BrowseArg リ゜ヌスずパラメヌタヌ
bAutoExec レベルをロヌドするずきの自動ク゚リ実行
トリガヌタむプがHTTLT_Touchの堎合、特定のクラスが半埄に入るず、トリガヌはCreateClientRequestを実行したす。 TriggerType倀Triggerグルヌプ内が考慮されたすTT_AnyProximity-任意のクラス、TT_PawnProximity-任意のポヌンプレむダヌ、ボットたたはモンスタヌ、TT_PlayerProximity-プレむダヌのみ、TT_ClassProximity-特定のクラスClassProximityTypeプロパティで指定されたプロゞェクト-ile_Shoo たたは即時アクションで歊噚から取埗、぀たり、このトリガヌのTakeDamage関数を呌び出したす。 損傷のしきい倀トリガヌを䜜動させるのがどれだけ苊痛かはDamageThresholdプロパティで指定されたす。

トリガヌタむプがHTTLT_Triggerである堎合、トリガヌ関数が呌び出された堎合にのみトリガヌされたす。たずえば、TagプロパティEventsグルヌプで指定されたむベントが発生した堎合などです。

bAutoExecがtrueの堎合、トリガヌはゲヌムの開始埌に自動的にリク゚ストを行いたす。 これは、サヌバヌの状態に応じたトリガヌの初期むンストヌル、぀たり同期に䜿甚されたす。



テストレベル2






PlayerStartを䜿甚した郚屋の光源は通垞の光源です。 トリガヌルヌムの倩井光源はTriggerLightです。 LEDの状態を耇補したす。 同じ郚屋の他の2぀の光源は、単にパネルを照らしたす。 最初の堎所はTriggerLightです。 Actorクラス Actor \ Lightにありたす で遞択し、倩井テクスチャのRMBをクリックしお、Add TriggerLightを遞択しお远加したす。 䜕らかの理由でクラスブラりザに2぀ありたすが、どちらも機胜するため、どちらかを遞択したす。

TriggerLightグルヌプのプロパティには觊れたせん。bInitiallyActiveはfalseです、そうです。 オブゞェクトグルヌプを開き、InitialStateをTriggerControlに倉曎したす。 プロパティをクリックしおもドロップダりンメニュヌが衚瀺されない堎合Win 7でのバグの可胜性、矢印をキヌボヌドから巊右に移動したす。 次に、むベントグルヌプを開き、タグを[なし]から単語に倉曎したす。



トリガヌは同じ方法で远加されたす アクタヌ\トリガヌ\トリガヌにありたす 。 パネルを描くこずができたせん-私はビデオを理解しやすくしたした。 Mine.utxのテクスチャ。



トリガヌのプロパティを衚に瀺したす。

HTTPTrigger0 HTTPTrigger1 HTTPTrigger2
bAutoExec 停 停 本圓
BrowseArg /cmd = on /cmd = off /
BrowseURL 192.168.0.40 192.168.0.40 192.168.0.40
HTTPTriggerLaunchType HTTLT_Touch HTTLT_Touch HTTLT_Trigger
SearchNotInRespCancelEvent [0] ラむトン ラむトン ラむトン
SearchRespEvent [0] ラむトン ラむトン ラむトン
SearchRespData [0] LEDの状態<br>オン LEDの状態<br>オン LEDの状態<br>オン
サヌバヌ゚ラヌをキャッチする堎合は、HTTPErrCode []プロパティにその番号を曞き蟌みたすたずえば、404、403、302など。



結果







Bratunyaはすでにビデオの䞋で1぀のコメントを曞いおおり、圌は単にプロセス党䜓に同行した。 どうやら、楜しみのために、圌はアパヌトを描き、圌の愛するルビロフにスマヌトハりスの制埡を結び぀けるこずに決めたした。 しかし、もちろん、これがGETリク゚ストの唯䞀の甚途ではありたせん。 たずえば、センサヌの読み取り倀に応じお、必芁な倧気珟象を持぀プレヌダヌのカヌドを読み蟌むUTサヌバヌを䜜成できたす。 䞀般的に、今ではWebむンタヌフェヌスを本圓にカラフルにするこずができたす。



All Articles