Urho3D゚ディタヌパヌト2

Urho3D゚ディタヌに぀いおは匕き続き理解しおいきたす。 このレッスンでは、物理孊を操䜜する方法、プレハブに粟通し、パヌティクル゚ディタをマスタヌし、銃を撃぀方法を孊びたす。 たた、ボヌナスずしお、ゲヌムリ゜ヌスをパックする方法を孊びたす。



物理孊



Urho3Dは、Box2DずBulletの2぀の物理ラむブラリをサポヌトしおいたす。 それらを操䜜する原理は非垞に䌌おいたすが、最初の方法はノヌドの移動をXY平面でのみ実装し、2番目の方法は3次元空間で実装したす。 Box2Dコンポヌネントは、[䜜成]-> [コンポヌネント]-> [Urho2D]メニュヌにあり、[匟䞞]メニュヌは[䜜成]-> [コンポヌネント]-> [物理]メニュヌにありたす。



そのため、 前回のレッスンのGameData \ Scenes \ Level01.xmlシヌンをロヌドしたす[ファむル]-> [最近のシヌンを開く]たたは[ファむル]-> [シヌンを開く...]。 床ず銃がありたす。 砲匟をシヌンに远加したしょう。 リ゜ヌスブラりザで、Modelsフォルダを開き、Cannonball.mdlを[階局]りィンドりにシヌンルヌトノヌドにドラッグしたす。 銃ず床が䜜業に干枉しないようにするには、[階局]りィンドりでノヌドを右クリックし、[有効化/無効化]を遞択したす。 同時に、それらはシヌンから消え、ノヌドは赀く塗られたす。 カヌネルのあるノヌドをダブルクリックするず、画面の䞭倮にカヌネルカヌネルが衚瀺されたす。







これで、リ゜ヌスブラりザで、[マテリアル]フォルダを開き、[階局]りィンドりたたは[属性むンスペクタヌ]りィンドりの[マテリアル]列のStaticModelコンポヌネントにマテリアルをドラッグしたす。 ノヌドに名前を付けお、「圱を萜ずす」オプションを有効にしたす。







RigidBodyおよびCollisionShapeコンポヌネント䜜成->コンポヌネント->物理をキャノンボヌルコアに远加したす。 この堎合、物理孊の䜜業に必芁なPhysicsWorldコンポヌネントがシヌンに自動的に远加されたす。



RigidBodyは、オブゞェクトの物理的特性を定矩したす。 ボディは静的および動的です。 静的な物䜓は動かず、障害物に過ぎず、動的な物䜓は倖力重力を含むの圱響を受けたす。 ボディに質量がある堎合-動的であり、質量がれロの堎合、ボディは静的です。



以䞋のスクリヌンショットのように、RigidBodyの質量、滑り摩擊、および転がり摩擊を蚭定したす。 CCD RadiusおよびCCD Motion Thresholdパラメヌタヌに泚目しおください。 小さな物䜓が障害物を高速で滑る堎合、これらのパラメヌタヌを蚭定するず圹立ちたす。







CollisionShapeは、衝突の蚈算に䜿甚されるオブゞェクトの圢状を定矩したす。 3Dモデル自䜓を䜿甚しないのはなぜですか 最適化するため。 たずえば、球ずの亀点を特定するには、球の䞭心たでの距離ずこの球の半埄を比范するだけで十分です。 これは、倚くの䞉角圢の亀点を蚈算するよりもはるかに高速です。 オブゞェクトには、圢状をより正確に蚘述するために耇数の圢状を含めるこずができたす。



CollisionShapeコンポヌネントのSphereタむプを遞択し、䞊のスクリヌンショットのように、キャノンボヌルの半埄に近い半埄を蚭定したす。



RevertOnPauseスむッチが有効になっおいるこずを確認し、RunUpdatePlayボタンをクリックしたす。 重力の圱響䞋にある砲匟は萜䞋し始めたす。 䞀時停止を抌すず、コアが元の堎所に戻りたす。



プレハブ



Unityで䜜業したこずがある人は、この抂念に粟通しおいるでしょう。 プレハブは、シヌンに繰り返し挿入できるオブゞェクトテンプレヌトです。 GameDataディレクトリにObjectsフォルダヌを䜜成したす。 Cannonballノヌドを遞択し、メニュヌ項目File-> Save node as ...を遞択し、ファむルGameData / Objects / Cannonball.xmlに保存したす。 これで、砲匟をシヌンから削陀できたす。 プレハブをシヌンに远加するには、メニュヌ項目[ファむル]-> [ノヌドのロヌド]を䜿甚したす。



銃、撃お



ガンずフロアノヌドをオンにしお、芋えるようにしたす。 RigidBodyおよびCollisionShapeコンポヌネントを䜜成したす。 床の堎合、StaticPlaneシェむプタむプ無限平面を遞択し、スリップフリクションずロヌリングフリクションを1に蚭定したすそうしないず、接觊時にオブゞェクトの摩擊が増加するため、ボディが無限に移動したす。 ガンの堎合、カプセル圢状の圢状を遞択し、圢状ノヌドではなくをサむズ=2、4.3、1およびオフセットオフセット䜍眮=0、1.12、0に蚭定したす。 銃の堎合、AnimationControllerコンポヌネントも远加したす䜜成->コンポヌネント->ロゞック。これにより、3D゚ディタヌで䜜成されたショットアニメヌションを再生できたす。



次に、銃スクリプトGameData \ Scripts \ Cannon.asを倉曎したすクリックしお展開したす。
class Cannon : ScriptObject { //      . int direction = 1; //    . float shootDelay = 0.0f; //    . void Update(float timeStep) { //     x (node   ,    ). float pitch = node.rotation.pitch; //   ,       . if (pitch >= 70.0f) direction = -1; else if (pitch <= -10.0f) direction = 1; pitch += 30.0f * direction * timeStep; node.rotation = Quaternion(pitch, 0.0f, 0.0f); if (shootDelay > 0.0f) shootDelay -= timeStep; //          , if (input.keyDown[KEY_SPACE] && shootDelay <= 0.0f) { Shoot(); //   shootDelay = 1.0f; //       . AnimationController@ animCtrl = node.GetComponent("AnimationController"); animCtrl.SetTime("Models/Shoot.ani", 0.0f); //    . animCtrl.PlayExclusive("Models/Shoot.ani", 0, false, 0.0f); //   . SoundSource3D@ source = node.CreateComponent("SoundSource3D"); //   . Sound@ sound = cache.GetResource("Sound", "Sounds/Shoot.wav"); source.autoRemove = true; //       . source.Play(sound); } } void Shoot() { //    CannonballPlace  . Vector3 position = node.GetChild("CannonballPlace", true).worldPosition; //    . XMLFile@ xml = cache.GetResource("XMLFile", "Objects/Cannonball.xml"); Node@ newNode = scene.InstantiateXML(xml, position, Quaternion()); //   RigidBody. RigidBody@ body = newNode.GetComponent("RigidBody"); //       ,        //     .     . body.ApplyImpulse(node.rotation * Vector3(0.0f, 1.0f, 0.0f) * 15.0f); } }
      
      





スペヌスバヌを抌すず、銃が栞を膚らたせお吐き出したす。



栞が存圚しおから10秒埌に栞を自己砎壊させたしょう。 次のテキストを含むCannonBall.asファむルをGameData \ Scriptsフォルダヌに䜜成したす。



 class Dying : ScriptObject { float time = 0.0f; void Update(float timeStep) { time += timeStep; if (time > 10.0f) node.Remove(); } }
      
      





次に、プレハブGameData / Objects / Cannonball.xmlをシヌンにロヌドしFile-> Load node-> As replicated / local ...、それにScriptInstanceコンポヌネントを远加し、新しく䜜成されたファむルを指定し、Dyingクラスの名前を入力したすEnterを抌すこずを忘れないでください。 これで、プレハブを保存しおシヌンから削陀できたす。 実行しお、栞が消える様子を芳察したす。



うさぎの町



倧砲から発射するキュヌブの建物をシヌンに远加したす。 通垞どおり、GameData / Models / Cube.mdlモデルをSceneルヌトノヌドにドラッグし、GameData / Materials / Cube.xmlに蚭定したす。 圱を萜ずすオプションも有効にしたす。 RigidBodyコンポヌネント質量= 1、摩擊= 1、ロヌリング摩擊= 0.2ずCollisionShapeコンポヌネント圢状タむプ=ボックス、サむズ=2、2、2を远加したす。 キュヌブを地面の少し䞊に眮きたす地面に浞すず、起動時に飛び出したす。 Ctrl + Dを抌しおキュヌブを耇補し、コピヌを暪に移動したす。 別のコピヌを䜜成したす。







ずころで、属性むンスペクタヌりィンドりでは、デフォルトず異なるすべおの倀が金色でマヌクされおいるこずに気付きたしたか



次に、Ctrlボタンを抌しながらキュヌブの行党䜓を遞択し、党䜓を耇​​補したす。 最初の行の䞊にコピヌを持ち䞊げたすギャップを忘れないでください。 次に、別の行を䜜成したす。







それを実行したす。 起動埌にキュヌブが少し萜ちるずいう問題がありたしたが、キュヌブを手䜜業で非垞に正確に重ねるこずは困難です。 ここで、RevertOnPauseスむッチが圹立ちたす。 それをオフにし、たた、銃でScriptInstanceコンポヌネントを無効にしたす以前にノヌド党䜓をオフにしたように、ノヌドではなくコンポヌネントを右クリックしたす。別の方法は、属性むンスペクタヌりィンドりで十字をクリックするこずです。







今、プレむを開始し、キュヌブが萜ちるずき-停止したす。 シヌンは新しい状態のたたでした。 RevertOnPauseずScriptInstanceを再床有効にしおください。



粒子



キャノンボヌルのパヌティクルの軌跡を䜜成したしょう。 メニュヌ項目の衚瀺->パヌティクル゚ディタからパヌティクル゚ディタを開きたす。 次のオプションを蚭定したす。





ここで、粒子の経時的な色の倉化を远加したす。 Color Framesブロックの䞋の[New]ボタンをダブルクリックしお、2぀の新しい行を䜜成し、䞋のスクリヌンショットのようにフィヌルドに入力したす。 最初の倀は時間であり、色はRGBA圢匏です。







[名前を付けお保存]ボタンをクリックしお、゚フェクトをGameData \ Particle \ Sparks.xmlファむルに保存し、パヌティクル゚ディタヌりィンドりを閉じたす。 砲匟のプレハブをシヌンにロヌドし、ParticleEmitterコンポヌネントを远加しお䜜成->コンポヌネント->ゞオメトリ、新しく䜜成した効果を指定し、プレハブをファむルに保存しお、砲匟をシヌンから削陀したす。 ゲヌムの準備ができたした。



次は



゚ディタヌのすべおの機胜を考慮したせんでした。 たずえば、むンタヌフェむスの䜜成やマテリアル゚ディタに぀いおの蚀葉はありたせんでした。 ただし、䞀般原則を理解し、それらに察凊するこずは難しくありたせん。



次に、ゲヌムを個別のプログラムずしお配眮する必芁がありたす。 蚈画は非垞に単玔です。シヌンをロヌドしお開始する最小限のスクリプトを䜜成したす。 ただし、シヌンには十分なカメラがなく、゚ディタヌの内郚カメラが䜿甚されたす。倖郚カメラは䜿甚できたせん。 通垞どおり、新しいノヌドを䜜成し、カメラコンポヌネントを远加したす䜜成->コンポヌネント->シヌン。 スクリプトでアクセスできるように、必ずノヌド名をCameraに蚭定しおください。 カメラを奜きなように配眮しお回転させたす右䞋隅に衚瀺されるカメラからのビュヌが圹立ちたす。 たた、SoundListenerコンポヌネントCreate-> Component-> Audioをカメラのあるノヌドにアタッチしたす。これがないず、空間に配眮されたサりンドが聞こえなくなりたす。 シヌンを保存し、次の内容のGameData \ Scripts \ Main.asファむルを䜜成したす。



 Scene@ scene_; void Start() { scene_ = Scene(); //    . scene_.LoadXML(cache.GetFile("Scenes/Level01.xml")); //      . Node@ cameraNode = scene_.GetChild("Camera"); //  ,       . Viewport@ viewport = Viewport(scene_, cameraNode.GetComponent("Camera")); renderer.viewports[0] = viewport; //     ,     . renderer.shadowMapSize = 2048; //    ,     . audio.listener = cameraNode.GetComponent("SoundListener"); }
      
      





CoreDataフォルダヌずUrho3DPlayer.exeランチャヌをゲヌムフォルダヌにコピヌしたす。 たた、Start.batを起動するためのバッチファむルが既にありたすUrho3DHabrahabr02Start.zipアヌカむブから。 ゲヌムのリ゜ヌス、りィンドりサむズ、起動スクリプトを含むフォルダヌをランチャヌに瀺したす。



 start "" Urho3DPlayer.exe Scripts/Main.as -p "GameData;CoreData" -w -x 800 -y 600
      
      





最終結果はここからダりンロヌドできたす 。



玄束のボヌナス



たず、コマンド「ScriptCompiler.exe GameData / Scripts / *。As」ですべおのスクリプトをコンパむルしたす。 その結果、拡匵子が.ascのファむルを取埗したす。 最近、 パッチが远加されたした。これにより、芁求された.asファむルがない堎合、.ascファむルがロヌドされたす。これは、名前の倉曎に察凊する必芁がないこずを意味したす。 ゜ヌス.asファむルをGameData \ Scriptsフォルダヌから別の堎所に移動するだけで、.ascファむルのみを残したす。



パッケヌゞ化には、Build \ bin \ tool \ PackageTool.exeナヌティリティが必芁です。 コマンドを実行したす。



 PackageTool.exe CoreData CoreData.pak -c PackageTool.exe GameData GameData.pak -c
      
      





-cオプションは、ファむル圧瞮をアクティブにしたす高速LZ4アルゎリズムを䜿甚。



これで、CoreDataおよびGameDataフォルダヌを削陀できたす。 その結果、次のこずができたす。







さお、非垞に矎しくするために、バッチファむルStart.batを削陀できたす。 ただし、このためには、ランチャヌの゜ヌスコヌドを倉曎する必芁がありたすUrho3D \ Source \ Tools \ Urho3DPlayerフォルダヌにありたす。 事前に怖がらないでください-ランチャヌ゜ヌスは非垞に小さいです。これは、ランチャヌパラメヌタヌが゚ンゞンに起動​​パラメヌタヌを転送するずいう事実のみを凊理するためです。 これらは、指定する必芁があるパラメヌタヌです。 同時に、アプリケヌション甚に独自のアむコンを䜜成できたす。



結論の代わりに



この機䌚に、 ロシア語版Wikiの内容に参加したい人を招埅したす。 ご枅聎ありがずうございたした



All Articles