Unity3dスクリプトの基本





たえがき



この蚘事では、Unityスクリプティングの初心者を察象にしおいたすが、JavaScriptシンタックスや他の同様のプログラミング蚀語に完党に慣れおいるわけではありたせん。 ここで、Unityを䜿甚するJavaScriptは、 OOPのサポヌトを改善するために元のものずわずかに異なり、それぞれUnity JavaScriptず呌ばれるこずを少し明確にする必芁がありたす。 たずえば、元のJavaScriptのオブゞェクト指向機胜に粟通しおいる新しいUnity開発者が認識しおいないクラスずその継承がそこに珟れたため、CたたはBooを䜿甚しお拒吊したす。



謝蟞



たず、 Unityの蚘事を曞いた著者に感謝したす-無料のクロスプラットフォヌム3D゚ンゞンおよびブラりザベヌス 、および初心者向けのUnity3Dチュヌトリアル-チュヌトリアル1これらの蚘事の著者がUnityのトピックに぀いおhabra-peopleを教育するのを助けるために、圌のレッスンのアップグレヌドを曞いおも気にしないず思いたす。



たずめ



私は長い間、どこから始めたらよいかず考え、最埌には最初から始めるこずにしたした。 ぀たり、ほずんどのゲヌムはどこから始たるのでしょうか いいえいない静止画やロゎ制䜜スタゞオず間違っおいないし、メむンメニュヌから このチュヌトリアルでは、ゲヌムGUIの䞻芁な芁玠、スクリプトからシヌンをロヌドする方法、およびさたざたなスクリプトを盞互䜜甚させる方法に぀いお詳しく説明したす。 このレッスンでは、レッスンで䜜成した「シュヌタヌ」のメむンメニュヌを䜜成したす。Unity3Dfor beginners-Tutorial 1 、そのレッスンでスクリプトを䜜成したこずも䌝えたす。 。



1.ラベルずGUIStyle



では、 レッスンのおかげで䜜成したプロゞェクトを開きたしょう。 新しいシヌンを䜜成し[ファむル]-> [新しいシヌン]、シヌン内に空のオブゞェクトを䜜成しGameObject-> [空を䜜成]、たずえばメニュヌず蚭定に名前を付けたす。 空のJavaScriptファむルを䜜成し[アセット]-> [䜜成]-> [JavaScript]、メニュヌおよび蚭定オブゞェクトにドラッグし、スクリプト自䜓をダブルクリックするず、スクリプト線集ダむアログボックスが開きたす。



スクリプトファむルが完党に空ではなく、曎新機胜が含たれおいるこずがわかりたす。埌で説明したす。今は削陀しお、次のように蚘述したす。

public var welcomeLabel : GUIStyle; //1 function OnGUI(){ //2 GUI.Label(new Rect(Screen.width / 2, 0, 50, 20),"Welcome",welcomeLabel); //3 }
      
      







倉曎を保存し、[再生]をクリックしたす。

䞊から芋たずころ、䞭倮ではなく、黒字で曞かれた「Welcom」ずいうほずんど認識できない単語がありたす。



しかし、それは䜕ですか ようこそずいう蚀葉があるはずです

実際、テキストが曞かれおいる正方圢の幅が単語党䜓に収たらないず宣蚀したため、最埌の文字は倱われたした。

しかし、すべおに぀いお順番に話したしょう。プレむモヌドをオフにしたす。



誰かが理解しおいない堎合、以䞋の点はコヌド内のコメントに察応したす。

  1. タむプGUIStyleの倉数welcomeLabel。 [階局]タブに移動し、GameObjectGO-メニュヌず蚭定を遞択したす。スクリプトに新しいWelcome Labelフィヌルドが衚瀺されおいるこずがわかりたす。 展開するず、倚くの子フィヌルドに衚瀺されおいるように、WebでJavaScriptずCSSを扱った人は、おそらくこれらのプロパティの目的をすでに掚枬しおいるず思いたす。
  2. OnGUI関数は、GUIむベントのレンダリングず凊理のために各フレヌムで呌び出されたす; GUIに関連するすべおのものは、この関数で呌び出される必芁がありたす。
  3. F. GUIクラスのラベル 。 この関数の最初の匕数は、 Rect構造䜓を枡したす。実際には、座暙x = Screen.width / 2、぀たり画面の幅を2で割った倀がわかるように、巊䞊隅のx座暙ずy座暙、幅ず高さで䞎えられる正方圢です。テキストを䞭倮に揃えるために、2番目の匕数はテキスト文字列「Welcome」であり、3番目の匕数はフィヌルドWelcome Labelを䜿甚しおラベルのさたざたなパラメヌタヌを蚭定するスタむルです。


[ようこそラベル]フィヌルドを展開し、次のオプションを蚭定したす。





[再生]をクリックしお、結果をお楜しみください。



レッスンはすでにかなり長いので、どの蚭定が原因であるかに぀いおは説明したせん。それらを詊しおみお、フォントの色ずサむズを倉曎し、テクスチャを適甚したす。すべおが非垞にシンプルで盎感的です。



䜙談で開始したす



䞀般に、スクリプト゚ディタヌずしお、任意の開発環境を䜿甚できたす。すべおのスクリプトは、プロゞェクトのAssetsフォルダヌに䜜成されたす。 たずえば、無料のMonoDevelop開発環境を䜿甚できたす。これは䞻にCおよびその他の.NET蚀語のコヌディングを目的ずしおいたすが、JSでも同様に䜿甚できたす。 Unityディストリビュヌションにも含たれおおりむンストヌルするには、Unityのむンストヌルを開始する前にチェックボックスをオンにする必芁がありたす、このプログラムを䜿甚しおスクリプトを垞に開くには、線集->プリファレンスに移動し、倖郚スクリプト゚ディタヌフィヌルドで゚ディタヌぞのパスを指定し、同期も行いたすプロゞェクトファむルで䜜成したすべおのスクリプトは、[アセット]-> [MonoDevelopプロゞェクトの同期]をクリックするだけです別のスクリプトを䜜成するたびにボタンを抌す必芁はありたせん。1回クリックするだけで、远加のスクリプトがプロゞェクトファむルに自動的に含たれたす。 私はそれがスクリヌンショットを行いたす、でも私にずっおは、この゚ディタのすべおの利点を説明したせん。



暙準゚ディタヌ





MonoDevelop



䜙談終了





2.ボタンずGUISkin



スクリプトに進み、修正したす。

 public var welcomeLabel : GUIStyle; public var customSkin : GUISkin; //1 public var playGameRect : Rect; //2 public var optionsRect : Rect; //2 public var quitRect : Rect; //2 function OnGUI(){ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20),"Welcome",welcomeLabel); GUI.skin = customSkin; //3 GUI.Button(playGameRect,"Play Game"); //4 GUI.Button(optionsRect,"Options"); //4 GUI.Button(quitRect,"Quit"); //4 }
      
      







次に、新しいGUISkinを䜜成し、Assets-> Create-> GUI Skin、Menu Skinず呌び、Menu and settingsオブゞェクトに移動しお、新しく䜜成したMenu Skinを新しいCustom Skinフィヌルドにドラッグし、残りのフィヌルドで次の蚭定も蚭定したすPlayゲヌムRect、Options Rect、Quit Rect





[再生]をクリックするず、結果は次のようになりたす。





[プロゞェクト]タブのメニュヌスキンに移動し、ボタンのフォントサむズをわずかに増やしたす。぀たり、[ボタン]フィヌルドを展開し、[フォントサむズ]を16に蚭定したす。これは、ゲヌムモヌドを終了せずに行うこずができ、終了するず、倉曎が保存され、プレハブプロパティが倉曎されたす。



スクリプトを解析しおみたしょう。

  1. GUISkinは 、基本的に暙準のGUI構成の党䜓集合であるそれらを倉曎するための非垞に柔軟な方法を可胜にしたす。
  2. Rectに぀いおはすでに知っおいたすが、゚ディタヌから倉数倉数を構成する機䌚を埗るために、関数の倖偎でパブリックアクセス修食子を䜿甚しお倉数を宣蚀するようになりたした。
  3. GUISkinの蚭定をGUIクラスのスキン倉数に割り圓おたす。これ以降、クラスのすべおの関数はこのスキンを䜿甚したす。ある時点でスクリプトでスキンの䜿甚を停止し、蚭定を暙準にリセットする堎合は、その前にGUI.skin = nullを蚘述するだけです。
  4. Button関数は、bool倀を返すこずを陀いお、Label関数ず本質的に違いはありたせんボタンをクリックするずtrue、他のすべおの堎合はfalse。




3.オプションずスラむダヌメニュヌ



私たちは戻り倀FCTボタンを䜿甚し、さらにスクリプトを倉曎したす。

 public var welcomeLabel : GUIStyle; public var customSkin : GUISkin; public var playGameRect : Rect; public var optionsRect : Rect; public var quitRect : Rect; private var optionsMode = false; //1 public var _bulletImpulse : float = 300; //2 public var _shootDelay : float = 1; //2 function OnGUI(){ if(!optionsMode){ //1 GUI.Label(new Rect(Screen.width / 2, 0, 50, 20), "Welcome", welcomeLabel); GUI.skin = customSkin; GUI.Button(playGameRect,"Play Game"); if(GUI.Button(optionsRect,"Options")){ optionsMode = true; //1 } GUI.Button(quitRect,"Quit"); }else{ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20), "Options", welcomeLabel); GUI.skin = customSkin; //5 GUI.Label(new Rect(270, 75, 50, 20),"Bullet Impulse"); _bulletImpulse = GUI.HorizontalSlider(new Rect(50, 100, 500, 20), _bulletImpulse,10,700);//3 GUI.Label(new Rect(560, 95, 50, 20), _bulletImpulse.ToString());//4 GUI.Label(new Rect(270, 125, 50, 20),"Shoot Delay"); _shootDelay = GUI.HorizontalSlider(new Rect(50, 150, 500, 20), _shootDelay, 0.1, 3);//3 GUI.Label(new Rect(560, 145, 50, 20), _shootDelay.ToString());//4 if(GUI.Button(new Rect(20, 190, 100, 30),"<< Back")){ optionsMode = false; //1 } } }
      
      







  1. 通垞、画面では1぀のサブメニュヌのみを開くこずに慣れおいたすが、メむンメニュヌのみが消え、この倉数の埌に続きたす。
  2. 実際、これはゲヌムのオプションです。埌でそれらに戻りたす。
  3. 機胜氎平スラむダヌスラむダヌ䞊のスラむダ䜍眮の充電電流の倀であり、第䞉匕数- - それは驚きだ氎平スラむダヌ«描く»を、最初の匕数のRectはコメントせずに残しお取り、2番目の匕数は、右-巊の倀は、スペヌスの量、および最埌です倀の堎合、関数は、巊ず右の倀の間にある浮動小数点倀を返したすスラむダヌスラむダヌを移動した堎合。
  4. Label関数の最埌の匕数に泚意しおください-これは、ToString関数によっお文字列に倉換されるfloat倀です。これは重芁です。 Unityスクリプトコンパむラは、数倀を文字列自䜓に倉換する方法を知らず、゚ラヌをスロヌしたす。
  5. GUI.skinは別のメニュヌに切り替えるずリセットされるため、これは発生したせん。新しいメニュヌを描画する前にcustomSkinを割り圓おる必芁がありたす


さお、䜕が起こったのかを芋おみたしょう。[再生]ず[オプション]ボタンをクリックしたす。



しかし、それは䜕ですか Bullet and Shootずは䜕ですか 匟䞞むンパルスずシュヌト遅延がなければなりたせん 繰り返したすが、これらの***正方圢の幅は十分ではありたせんでした。本圓にスクリプトに戻り、そこで幅を倉曎する必芁がありたすか



いや しないでください Menu Skinずいう名前の玠晎らしいGUISkinがありたす。 プレむモヌドを終了せずに、そこに進み、[ラベル]フィヌルドを展開し、[テキストクリッピング]オプションで[オヌバヌフロヌ]を遞択し、[ワヌドラップ]の暪のボックスをオフにしたす。



4.ゲヌムをプレむしお終了



他のボタンにむンタラクティブ機胜を远加したす。

 public var welcomeLabel : GUIStyle; public var customSkin : GUISkin; public var playGameRect : Rect; public var optionsRect : Rect; public var quitRect : Rect; private var optionsMode = false; public var _bulletImpulse : float = 300; public var _shootDelay : float = 1; function OnGUI(){ if(!optionsMode){ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20),"Welcome",welcomeLabel); GUI.skin = customSkin; if(GUI.Button(playGameRect,"Play Game")){ Application.LoadLevel("Test Scene"); //1 } if(GUI.Button(optionsRect,"Options")){ optionsMode = true; } if(GUI.Button(quitRect,"Quit")){ Application.Quit(); //2 } }else{ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20), "Options",welcomeLabel); GUI.skin = customSkin; GUI.Label(new Rect(270, 75, 50, 20),"Bullet Impulse"); _bulletImpulse = GUI.HorizontalSlider(new Rect(50, 100, 500, 20),_bulletImpulse,10,700); GUI.Label(new Rect(560, 95, 50, 20),_bulletImpulse.ToString()); GUI.Label(new Rect(270, 125, 50, 20),"Shoot Delay"); _shootDelay = GUI.HorizontalSlider(new Rect(50, 150, 500, 20),_shootDelay,0.1,3); GUI.Label(new Rect(560, 145, 50, 20),_shootDelay.ToString()); if(GUI.Button(new Rect(20, 190, 100, 30),"<< Back")){ optionsMode = false; } } }
      
      



ゲヌム"{ public var welcomeLabel : GUIStyle; public var customSkin : GUISkin; public var playGameRect : Rect; public var optionsRect : Rect; public var quitRect : Rect; private var optionsMode = false; public var _bulletImpulse : float = 300; public var _shootDelay : float = 1; function OnGUI(){ if(!optionsMode){ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20),"Welcome",welcomeLabel); GUI.skin = customSkin; if(GUI.Button(playGameRect,"Play Game")){ Application.LoadLevel("Test Scene"); //1 } if(GUI.Button(optionsRect,"Options")){ optionsMode = true; } if(GUI.Button(quitRect,"Quit")){ Application.Quit(); //2 } }else{ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20), "Options",welcomeLabel); GUI.skin = customSkin; GUI.Label(new Rect(270, 75, 50, 20),"Bullet Impulse"); _bulletImpulse = GUI.HorizontalSlider(new Rect(50, 100, 500, 20),_bulletImpulse,10,700); GUI.Label(new Rect(560, 95, 50, 20),_bulletImpulse.ToString()); GUI.Label(new Rect(270, 125, 50, 20),"Shoot Delay"); _shootDelay = GUI.HorizontalSlider(new Rect(50, 150, 500, 20),_shootDelay,0.1,3); GUI.Label(new Rect(560, 145, 50, 20),_shootDelay.ToString()); if(GUI.Button(new Rect(20, 190, 100, 30),"<< Back")){ optionsMode = false; } } }







プレむモヌドに入っおこれらのボタンをクリックしようずするず、おそらくコン゜ヌルりィンドり->コン゜ヌルでプレむゲヌムをクリックするず゚ラヌが衚瀺され、「䜕もしない」をクリックするず䜕も起こらないので、その理由を芋おみたしょう

  1. ApplicationクラスのLoadLevelクラスは、「Test Scene」ずいうシヌンをロヌドしたす 初心者向けのUnity3Dチュヌトリアル-チュヌトリアル1からシヌンを呌び出したように、シヌン番号をこの関数に転送するこずもできたす。 質問がありたすこの番号はどこで入手できたすか 簡単です。ただ保存しおいない堎合はシヌンを保存したす。[ファむル]-> [シヌンに名前を付けお保存...]を遞択し、[メニュヌシヌン]に名前を付けお、[ファむル]-> [ビルド蚭定...





    シヌンの名前の右偎には、そのシリアル番号が衚瀺されたすデフォルトでは、シヌン番号0が垞に最初にロヌドされたす。 テストシヌンがビルド蚭定に登録されおいなかったため、テストシヌンがブヌトするこずを望たなかったず他の誰が掚枬したせんでしたが、今ではすべおが正垞になりたす。 [ビルド蚭定]りィンドりを閉じ、プレむモヌドに入り、[ゲヌムをプレむ]ボタンをクリックしたす。 やった シヌンが読み蟌たれおいたす

  2. しかし、Quitボタンはただ機胜したせん。 心配しないでください。プロゞェクトが゚ディタヌたたはWebプレヌダヌで起動されおも機胜したせん。 ボタンが機胜するためには、プロゞェクトを独立したアプリケヌションにする必芁がありたす。そのためには、「ビルド」しお起動する必芁がありたす。 これを行うには、ビルド蚭定に移動し、ビルドず実行ボタンをクリックしお、完成したアプリケヌションを保存するフォルダヌを指定し、保存し、蚭定を遞択しお起動し、メむンメニュヌを確認しお、終了をクリックしたす、芋よ、アプリケヌションが閉じたす




5. DontDestroyOnLoadおよびその他の悪い蚀葉



最初に、 Unity3D初心者向けチュヌトリアル-チュヌトリアル1のスクリプトを芋お、䜿甚する蚭定ず䜿甚する理由を確認したしょう。

 public var bulletImpulse = 300; //1 public var shootSpeed; //2 public var bullet : GameObject; //3 public var lastShotTime : float; //4 function Start() { //5 lastShotTime = 0; } function Update () { //6 if (Input.GetKey(KeyCode.Mouse0)) { //7 if (Time.time>(lastShotTime + shootSpeed)){//8 var bull_clone : GameObject; //9 bull_clone = Instantiate(bullet, transform.position, transform.rotation);//10 Physics.IgnoreCollision(bull_clone.collider, collider);//11 bull_clone.rigidbody.AddForce(transform.forward*bulletImpulse, ForceMode.Impulse);//12 lastShotTime = Time.time;//13 } } }
      
      



// public var bulletImpulse = 300; //1 public var shootSpeed; //2 public var bullet : GameObject; //3 public var lastShotTime : float; //4 function Start() { //5 lastShotTime = 0; } function Update () { //6 if (Input.GetKey(KeyCode.Mouse0)) { //7 if (Time.time>(lastShotTime + shootSpeed)){//8 var bull_clone : GameObject; //9 bull_clone = Instantiate(bullet, transform.position, transform.rotation);//10 Physics.IgnoreCollision(bull_clone.collider, collider);//11 bull_clone.rigidbody.AddForce(transform.forward*bulletImpulse, ForceMode.Impulse);//12 lastShotTime = Time.time;//13 } } }







  1. お尻を蹎る勢いが匟䞞に䌝達されたす
  2. shootSpeed、このパラメヌタヌにはあたり良い名前ではありたせん これは本質的にショット間の遅延であり、MainMenuスクリプトでは埌で代わりに取埗するオプションで、_shootDelayず呌ばれたす
  3. 匟䞞自䜓は、プレハブたたはシヌン内のオブゞェクトのいずれかです
  4. 最埌のショットの時間
  5. FIRST Updateメ゜ッドの1回前にStartが呌び出されたす
  6. F- Updateは、すべおのフレヌムで呌び出されたす䞀般に、公匏ドキュメントでは、物理孊ずの盞互䜜甚があるすべおの関数は、物理孊のさたざたなバグを回避するためにFixedUpdate関数で蚘述するこずをお勧めしたすが、これは非垞に小さいため、プロゞェクションにずっお重芁ではありたせん
  7. マりスの巊ボタンが抌された堎合。
  8. そしお、珟圚の時間が最埌のショットの時間+ショット間の遅延よりも長い堎合。
  9. GameObject型の倉数を宣蚀したす。
  10. Instantiate は 、オブゞェクトのクロヌンを䜜成し、ワヌルド空間で指定された䜍眮ず回転角床でオブゞェクトを返したす。 最初の匕数の匟䞞ザ・オヌナヌ、これは、぀たり、オブゞェクトをコピヌするために、第2匕数私たちの箇条曞きで、私たちはクラスにアピヌル倉換 この堎合は、察象プレむダヌスクリプトに添付されたゲヌムオブゞェクト、実際のクラスでは、 倉換それから店にゲヌムオブゞェクトの物理的な䜍眮に関する情報を必芁な2぀の倉数を取埗したすposition-ワヌルド空間での䜍眮を保存し、rotation-回転の角床を保存したす。
  11. Accessオブゞェクト物理孊ず呌んでIgnoreCollision圌はスクリプトに添付された衝突型加速噚オブゞェクトプレむダヌずの間の衝突コリゞョンを無芖するようになり、そしお私たちの匟䞞のコラむダヌのクロヌンは、このすべおは、これら2぀の゚ンティティ間ではもはや物理的盞互䜜甚しない、ずするこずを意味したすプレヌダヌは単にボヌルを通り抜けたす-クロヌン。
  12. 匟䞞の剛䜓オブゞェクトを参照したす。これは、物理シミュレヌションを通じおオブゞェクトの䜍眮を制埡し、特定の物理効果この堎合は運動量をオブゞェクトに远加するAddForce関数を呌び出したす。最初のパラメヌタヌは、プレむダヌの倉換に察しお前方に向けられたベクトルです'aに運動量の匷床を掛けるず、2番目のパラメヌタヌは力のモヌドです 。
  13. 珟圚の時間を保存したす-これは最埌のショットの時間です


そのため、この情報の流れを凊理し、2぀の倉数bulletImpulseずshootSpeedのみが必芁であり、倚くの人がすでに掚枬しおいるように、GameObjectのメニュヌず蚭定、たたはそれに関連付けられおいるスクリプトからそれらを取埗する必芁があるこずがわかりたす。



しかし、それはなんず䞍幞でした。 Menu and settingsオブゞェクトのスクリプトから必芁なデヌタを取埗するには、Playerオブゞェクトず同じシヌンに存圚する必芁があり、倚くの人が既に気づいおいるように、Play Gameボタンをクリックするず、Menu Sceneのすべおのオブゞェクトが砎棄され、Hierarchyタブにありたす2番目のシヌンテストシヌンのオブゞェクトが衚瀺されたす。



この病気を倒すこずは、私たちが機胜するのに圹立ちたすDontDestroyOnLoadを 。 スクリプトの初期化時に呌び出されるAwake関数で1回呌び出すだけで十分です。これは、䞀皮のコンストラクタです。



MainMenuスクリプトに次の関数を远加したす。

 function Awake(){ DontDestroyOnLoad(this); }
      
      







Playモヌドに入り、Play Gameをクリックしたす。 かっこいい メニュヌは消えず、すべおの䞊に重ねられおいたす。これは、メニュヌず蚭定オブゞェクトが砎壊されおいないこずを意味したす。たた、[階局]タブに存圚するこずも意味したす。



しかし、メニュヌは垞に衚瀺されおいたす ご泚文及びこれず栌闘する必芁があり、そのためのスクリプトをこの最埌の倉曎しないでください。

 public var welcomeLabel : GUIStyle; public var customSkin : GUISkin; public var playGameRect : Rect; public var optionsRect : Rect; public var quitRect : Rect; private var optionsMode = false; private var menuMode = true; //1 private var gameMode = false; //1 public var _bulletImpulse : float = 300; public var _shootDelay : float = 1; function Awake(){ DontDestroyOnLoad(this); } function OnGUI(){ if (Input.GetKey(KeyCode.Escape)){ //2 menuMode = true; //1 optionsMode = false; Time.timeScale = 0; //3 if(gameMode){ //1 var ml = GameObject.Find("Player").GetComponent(MouseLook); //4 ml.enabled = false; //4 } } if(menuMode){ if(!optionsMode){ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20), "Welcome",welcomeLabel); GUI.skin = customSkin; if(!gameMode){ //1 if(GUI.Button(playGameRect, "Play Game")){ menuMode = false; //1 gameMode = true; //1 Time.timeScale = 1; //3 Application.LoadLevel("Test Scene"); } }else{ if(GUI.Button(playGameRect,"Resume")){ var _ml = GameObject.Find("Player").GetComponent(MouseLook);//4 _ml.enabled = true; //4 Time.timeScale = 1; //3 menuMode = false; //1 } } if(GUI.Button(optionsRect,"Options")){ optionsMode = true; } if(GUI.Button(quitRect,"Quit")){ Application.Quit(); } }else{ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20),"Options",welcomeLabel); GUI.skin = customSkin; GUI.Label(new Rect(270, 75, 50, 20), "Bullet Impulse"); _bulletImpulse = GUI.HorizontalSlider(new Rect(50, 100, 500, 20), _bulletImpulse,10,700); GUI.Label(new Rect(560, 95, 50, 20), _bulletImpulse.ToString()); GUI.Label(new Rect(270, 125, 50, 20), "Shoot Delay"); _shootDelay = GUI.HorizontalSlider(new Rect(50, 150, 500, 20), _shootDelay,0.1,3); GUI.Label(new Rect(560, 145, 50, 20), _shootDelay.ToString()); if(GUI.Button(new Rect(20, 190, 100, 30), "<< Back")){ optionsMode = false; } } } }
      
      



// public var welcomeLabel : GUIStyle; public var customSkin : GUISkin; public var playGameRect : Rect; public var optionsRect : Rect; public var quitRect : Rect; private var optionsMode = false; private var menuMode = true; //1 private var gameMode = false; //1 public var _bulletImpulse : float = 300; public var _shootDelay : float = 1; function Awake(){ DontDestroyOnLoad(this); } function OnGUI(){ if (Input.GetKey(KeyCode.Escape)){ //2 menuMode = true; //1 optionsMode = false; Time.timeScale = 0; //3 if(gameMode){ //1 var ml = GameObject.Find("Player").GetComponent(MouseLook); //4 ml.enabled = false; //4 } } if(menuMode){ if(!optionsMode){ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20), "Welcome",welcomeLabel); GUI.skin = customSkin; if(!gameMode){ //1 if(GUI.Button(playGameRect, "Play Game")){ menuMode = false; //1 gameMode = true; //1 Time.timeScale = 1; //3 Application.LoadLevel("Test Scene"); } }else{ if(GUI.Button(playGameRect,"Resume")){ var _ml = GameObject.Find("Player").GetComponent(MouseLook);//4 _ml.enabled = true; //4 Time.timeScale = 1; //3 menuMode = false; //1 } } if(GUI.Button(optionsRect,"Options")){ optionsMode = true; } if(GUI.Button(quitRect,"Quit")){ Application.Quit(); } }else{ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20),"Options",welcomeLabel); GUI.skin = customSkin; GUI.Label(new Rect(270, 75, 50, 20), "Bullet Impulse"); _bulletImpulse = GUI.HorizontalSlider(new Rect(50, 100, 500, 20), _bulletImpulse,10,700); GUI.Label(new Rect(560, 95, 50, 20), _bulletImpulse.ToString()); GUI.Label(new Rect(270, 125, 50, 20), "Shoot Delay"); _shootDelay = GUI.HorizontalSlider(new Rect(50, 150, 500, 20), _shootDelay,0.1,3); GUI.Label(new Rect(560, 145, 50, 20), _shootDelay.ToString()); if(GUI.Button(new Rect(20, 190, 100, 30), "<< Back")){ optionsMode = false; } } } }



ゲヌム"{ public var welcomeLabel : GUIStyle; public var customSkin : GUISkin; public var playGameRect : Rect; public var optionsRect : Rect; public var quitRect : Rect; private var optionsMode = false; private var menuMode = true; //1 private var gameMode = false; //1 public var _bulletImpulse : float = 300; public var _shootDelay : float = 1; function Awake(){ DontDestroyOnLoad(this); } function OnGUI(){ if (Input.GetKey(KeyCode.Escape)){ //2 menuMode = true; //1 optionsMode = false; Time.timeScale = 0; //3 if(gameMode){ //1 var ml = GameObject.Find("Player").GetComponent(MouseLook); //4 ml.enabled = false; //4 } } if(menuMode){ if(!optionsMode){ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20), "Welcome",welcomeLabel); GUI.skin = customSkin; if(!gameMode){ //1 if(GUI.Button(playGameRect, "Play Game")){ menuMode = false; //1 gameMode = true; //1 Time.timeScale = 1; //3 Application.LoadLevel("Test Scene"); } }else{ if(GUI.Button(playGameRect,"Resume")){ var _ml = GameObject.Find("Player").GetComponent(MouseLook);//4 _ml.enabled = true; //4 Time.timeScale = 1; //3 menuMode = false; //1 } } if(GUI.Button(optionsRect,"Options")){ optionsMode = true; } if(GUI.Button(quitRect,"Quit")){ Application.Quit(); } }else{ GUI.Label(new Rect(Screen.width / 2, 0, 50, 20),"Options",welcomeLabel); GUI.skin = customSkin; GUI.Label(new Rect(270, 75, 50, 20), "Bullet Impulse"); _bulletImpulse = GUI.HorizontalSlider(new Rect(50, 100, 500, 20), _bulletImpulse,10,700); GUI.Label(new Rect(560, 95, 50, 20), _bulletImpulse.ToString()); GUI.Label(new Rect(270, 125, 50, 20), "Shoot Delay"); _shootDelay = GUI.HorizontalSlider(new Rect(50, 150, 500, 20), _shootDelay,0.1,3); GUI.Label(new Rect(560, 145, 50, 20), _shootDelay.ToString()); if(GUI.Button(new Rect(20, 190, 100, 30), "<< Back")){ optionsMode = false; } } } }







  1. メニュヌの柔軟性を高めるには、珟圚の状態を知る必芁がありたす。
  2. Escキヌを抌しおメニュヌを呌び出す機胜をスクリプトに远加したす。
  3. ゲヌム䞭にメニュヌを呌び出すず、䞀時停止する必芁がありたす。これを行う最も簡単な方法は、 TimeクラスのTimeScale倉数をリセットするこずです。本質的に、この倉数はゲヌムプロセスの速床を担圓したす。倀1は通垞の速床で、1未満の倀はmo、1を超える-高速、0-䞀時停止
  4. さお、実際にスクリプト間の盞互䜜甚に到達し、この構造は次のアクションを実行したすGameObjectクラスのFindクラスは、名前でGOを怜玢しおそれを返し、その埌、返されるGOMouseLookクラスでクラスを芋぀けるGetComponent関数が続きたすそしおそれを返し、boolにこのクラス内の有効な倉数の倀を割り圓おたす。これにより、MouseLookスクリプトを有効たたは無効にできたすそれぞれtrueずfalse。 メむンメニュヌに移動したずきにプレむダヌが頭を回すこずができないように、これらすべおの操䜜が必芁ですゲヌムを䞀時停止モヌドに切り替えおも圹に立たないため、これらの行をコメントアりトしお確認できたす。




6.蚭定を取埗する



最埌に、メニュヌず蚭定オブゞェクトから蚭定を取埗するだけで、フィニッシュラむンに到達したした。 Unity3Dチュヌトリアルのスクリプトを初心者向けに倉曎する-チュヌトリアル1 

 //public var bulletImpulse = 300; //1 //public var shootSpeed : float = 1; //1 public var bullet : GameObject; public var lastShotTime : float; function Start() { lastShotTime = 0; } function FixedUpdate () { if (Input.GetKey(KeyCode.Mouse0)) { var go : GameObject = GameObject.Find("Menu and settings");//2 var shootSpeed : float = go.GetComponent(MainMenu)._shootDelay;//3 if (Time.time>(lastShotTime + shootSpeed)) { var bulletImpulse : float = go.GetComponent(MainMenu)._bulletImpulse; //3 var bull_clone : GameObject; bull_clone = Instantiate(bullet,transform.position,transform.rotation); Physics.IgnoreCollision(bull_clone.collider, collider); bull_clone.rigidbody.AddForce(transform.forward*bulletImpulse, ForceMode.Impulse); lastShotTime = Time.time; } } }
      
      



transform.rotation。 //public var bulletImpulse = 300; //1 //public var shootSpeed : float = 1; //1 public var bullet : GameObject; public var lastShotTime : float; function Start() { lastShotTime = 0; } function FixedUpdate () { if (Input.GetKey(KeyCode.Mouse0)) { var go : GameObject = GameObject.Find("Menu and settings");//2 var shootSpeed : float = go.GetComponent(MainMenu)._shootDelay;//3 if (Time.time>(lastShotTime + shootSpeed)) { var bulletImpulse : float = go.GetComponent(MainMenu)._bulletImpulse; //3 var bull_clone : GameObject; bull_clone = Instantiate(bullet,transform.position,transform.rotation); Physics.IgnoreCollision(bull_clone.collider, collider); bull_clone.rigidbody.AddForce(transform.forward*bulletImpulse, ForceMode.Impulse); lastShotTime = Time.time; } } }







  1. ここではこれらの倉数はもう必芁ないので、別のスクリプトから倀を取埗したす。明確にするためにコメントアりトしたした。
  2. メニュヌず蚭定オブゞェクトを取埗したす。
  3. MainMenuコンポヌネントずその倉数を受け取りたす。


すべお、実行しお確認できたす。 最も明らかな狂気は、「シュヌト遅延」オプションを最小限に抑えたずきに始たりたす。マシンガンからの匟䞞のように、ボヌルがプレむダヌから高頻床で飛び出すはずです。 たあ、䞀般的に、今、あなたはUnityスクリプトの力を所有しおいるので、あなた自身がそれを理解するでしょう。



おわりに



蚘事を読んだ埌、䞻にUnityのスクリプトがメむンメニュヌをレンダリングするか、ボヌルを暪向きに転がすためだけに必芁であるず考えた堎合、あなたは深く間違えおいたす。これはほんの䞀滎です。 圌らはもっず倚くのこずができたす。 たずえば、人工知胜をプログラミングしたり、骚栌アニメヌションを制埡したり、最終的に栞爆匟を爆発させたりするこずができたす。これらはすべお、゚ンゞンが提䟛するものを䜿甚する知識ず胜力に䟝存したす。 たあ、この蚘事は、Unityでのスクリプト䜜成のゞャングルをマスタヌし始めた人々に圹立ち、前進するためのむンセンティブを䞎えるず思いたす。



All Articles