Unity3dでのゲームプロジェクトのプロトタイピング

たまたま、私は1年間、寒いフィンランドに住んでいます。 当初、私はここに来て勉強しましたが、過去数ヶ月間、積極的に仕事を探していました:私は履歴書の大量郵送に従事し、多くのイベント/会議を訪問し、さまざまなフィンランドのゲームディーラーのいくつかのオフィスを訪問しました。 ちなみに、彼らはたくさんいます:地元の国際ゲーム開発者協会(そのネイティブのウクライナ人とは異なります)は、月に1回、無料でビールを飲んで生活しています。 そのため、多くの企業(10〜20名の従業員)がUnity3Dに切り替えているか、既に切り替えていることに気付きました。



当初、この記事はwhat_program_write / what_player_willのバランスに関する哲学的考察として計画されていましたが、Unityを使用するための有用なスニペットやヒントの不純物が含まれています。 実際、ある会社でテストタスクを実行中に、 ミューズが突然私に似たような記事を書くように思いついたので、それがどうなるかはまだわかりません。





そもそも、私自身についての数十の言葉:私はgamedevに興味があるので、10年が過ぎました-ちょうど10年前、私はPascal、Sea Wars、別名sea battleで最初のゲームをリベットしました。 彼はアマチュアレベルで、主に熱狂的なプロジェクトで勉強し、比較的大企業で数回働き、経験を積んだ。 彼は多くのエンジンを使用していました。最初は3D Gamestudio、Ogre、Irrlicht、Leadwerks、およびその他のTorqueを使用していました。 今年までUnity3Dはあまり好きではありませんでした。 グローバルゲームジャムの後-彼の心を劇的に変えました。



研究について:私はキエフ工科大学の学業を卒業しましたが、教育のレベルには多くの要望が残っていることに気づきました(グループにプログラミングに興味を持っている人は3人しかいなかったため)。



一般に、フィンランドでの生活、大学、IGDAの飲酒の詳細については、別の機会に話しましょう。ゲーム開発に移りましょう。



テストタスクは次のとおりでした:航空機の飛行と着陸、側面図のプロトタイプを書く必要がありました。 その位置を直接編集(変換)することは禁止されています。力(力)とトルク(トルク)のみを適用できます。 2日間の時間を要求し、2日後にタスクを完了しました。 確かに、彼はさらに数日間物理学で遊んでいて、4日後に最終版を送りました。



そこで、次のコード分類を思いつきました。

1)多くのコードと時間のコスト、プレーヤーにとって効果は最小限です

2)中程度のコード、効果はまあまあです

3)数行のコード、効果は明ら​​かで、一般の人々はショックを受けています



1.多くのコード、効果はほとんど目に見えない/または彼らはそれに注意を払っていない



最も出血性で恩知らずな部分。 それがなければ、誰もゲームをプレイしませんが、たとえそれが完全に行われたとしても、誰もそれに注意を払うことはありません:これは物事の順序です。 しかし、軽微な欠陥はすぐに明らかになります。 短い名前「 彼女が存在しない場合、彼女は存在しなければならない-失敗 」。



たとえば、物理学をゼロから何度も作り直しました。

-最初は、式と質量/翼幅/エンジン出力の実際の値だけを試しましたが、後で係数を入力しました。 私にとっては、正確な値は重要ではなく、増加の順序、たとえば、持ち上げ力の速度への依存性が重要であるという事実を正当化しました。 結果として、実際の数式よりも数式の「発見」が多くなります。 失敗。

-その後、彼は厳しい顔をして、空気力学に関するソビエトの本を汲み上げ、科学のすべてを始めました。 しかし、結果はそれほど良くありませんでした。追加は少なかったのですが、飛行品質はまだ不十分でした。

-同様のフライトシミュレーターをグーグルに登り、JSBSimで少し遊んだ。 満足できるものは見つかりませんでしたが、式に注意しました。

-今回は科学とリアリズムで得点し、飛行機を最小重量/範囲/出力に設定し、すべての新たな経験を組み合わせ始めました。 最終日、アマチュアの友人IL-2のアドバイスで、彼は鼻に「うなずき」を加えました。



ただし、この作業はすべてゲーム中にほとんど目立ちません。そうすべきです。そうでなければ、なぜプロジェクトをまったく見せないのでしょうか。 実際、これは非常に論理的です。



そこからのコードの一部(物理学を計算する機能全体が非常に大きいため、最も興味深い部分を説明します)。 レビュー担当者がチェックアウトできるように、この難しい場所にコメントを追加しました:)



私は通常、Sharp for Unityのために書いていますが、JavaScriptで書くように頼まれました。 JavaScriptはとてもJavaScriptです...

//// Thrust force // Ft = const * p * n^2 * d^4, // where const = 1,3; p = 0.125; n = power; d = screw diameter (2,4 for F4U-1 Corsair) // Ft = 5.39 * n^2 trustCoeff = rotorVelocity * power*power * powerCoeff; thrustVector = Vector3(1,0,0) * trustCoeff; //// Angle of attack, Lift force // http://wright.nasa.gov/airplane/lifteq.html // http://wright.nasa.gov/airplane/incline.html // C = 2 * m * alpha // L = 1/2 * p * V^2 * A * C , where p = 0.125 [kg * sec^2 / meter^4] at +15C; A = 9.172 for F4U-1 Corsair // L = 1.14 * V^2 * (m * alpha) speedWeight = 0.0125 * (velocityForwardVectorSqr/2); liftCoeff = wingspan * attackAlpha * speedWeight * weightCoeff; liftVector = Vector3(0,1,0) * liftCoeff; //// Air resistance = base resistance + inductive resistance // http://en.wikipedia.org/wiki/Parasitic_drag // http://en.wikipedia.org/wiki/Lift-induced_drag // resistBasic = Const * (p * V^2 * S) / 2 = Const' * V^2 * S // resistInductive = liftForce^2 / (p * V^2/2 * S) dragCoefficient = 2*airDrag + 2 * airDrag * horizonAngle * wingspanCoeff; dragVector = - airSpeedVector * dragCoefficient;
      
      







最後の瞬間、私は絵を描くために突破しました。 だからあなたは私のスキルを楽しむための排他的な機会を持っています:)

ハードヒットしないでください、私はアーティストではありません。







2.中程度のコード、効果はまあまあです



最も平均的で説明のない部分。 短い名前「 もしあれば-良い、そうでなければ-いい、大丈夫 」 強さは平均して...うーんと費やされ、想像力の小さな飛躍をもたらします。



ミューズは彼の拳でテーブルを叩き、そうするように言ったので、私は少し見せびらかし、風景の手続き的な生成を行うことにしました。 この場合、海または地球の2種類です。 Earthは、キューブでできたMinecraftスタイルで実装されています。 どのコードを持ち込むかわからないので、あまり長くはありませんが、興味深いものです。 ついでに、彼は最後から2番目の夜、夜を見ていたので、リファクタリングすることがたくさんあります。



 var firstIslandLength: int = Random.Range(70, 130); // width of island generationDist = 0; GenerateIsland(generationDist, firstIslandLength); var firstOceanLength: int = Random.Range(50, 100); generationDist += firstIslandLength + firstOceanLength; GenerateOcean(generationDist, firstOceanLength); var secondIslandLength: int = Random.Range(10, 30); generationDist += firstOceanLength + secondIslandLength; GenerateIsland(generationDist, secondIslandLength); var secondOceanLength: int = Random.Range(100, 150); generationDist += secondIslandLength + secondOceanLength; GenerateOcean(generationDist, secondOceanLength); var thirdIslandLength: int = Random.Range(70, 80); generationDist += secondOceanLength + thirdIslandLength; GenerateIsland(generationDist, secondOceanLength); GenerateTargetObj(generationDist, secondOceanLength); } function GenerateOcean(pos: int, length: int) { var newOcean = Instantiate(waterObject, Vector3(pos - 5, -2, 50), Quaternion.identity); newOcean.transform.localScale.x = length/4; Debug.Log("Ocean. Pos: " + pos + ". Length: " + length); }
      
      







スキームは次のようになります。





3.数行のコード、効果は明ら​​かです



特に、ゲーム開発とプロトタイピングの最初、2番目、3番目のステップを踏む人にとっては、この作品の最も重要で興味深い部分です。 そしてUnity3dのヒントを待っていた人たちのために 。 短い名前「 もしそうなら、それはクールです、もしそこになければ、プロジェクトは生のように見えます。」



Unityの場合:

-スカイボックスを含むパックをインポートします(アセット/パッケージのインポート/スカイボックス)。

-新しいオブジェクト(ゲームオブジェクト/空の作成)を作成します。既存のオブジェクトを取得できます。

-新しいSkyboxControlスクリプトを作成する

-スクリプトでは、3行も記述します

  var skyboxMaterials: Material[]; function Start () { RenderSettings.skybox = skyboxMaterials[Random.Range(0, skyboxMaterials.length - 1)]; }
      
      





-スクリプトを新しく作成したオブジェクトにドラッグし、Skybox Materialsの近くにある矢印をクリックして、数字を入力します。たとえば、4:4つの要素の配列が作成されて開きます

-標準アセット/スカイボックスを開き、上記の配列に任意のスカイボックスを入力します



何が得られますか? 1分間がアクションに費やされ(これと、ビールと一口を飲みます)、ゲームを新たに再起動するたびに、幸せなユーザーに新しいランダムスカイボックスが表示されます。



別の例:音。 私の場合、プロペラの回転音がありました。それを美しく見せたいと思いました。

お願い:

-私たちは、有声物に音を投げます

- ツンドラの腸スクリプトレギンスのカワウソ 、Update()関数のどこかに1行も書く

 soundPlayer.audio.pitch = rotorVelocity;
      
      





ローター速度は、プレーヤーが制御するネジの回転速度で、ユーザーがボタンを押している時間に応じて、間隔[0..1]で変化します。



それだけです、私たちは利益を得ます。 モーターの回転速度の値が大きいほど、音は速くなります。 ビールのフィニッシュに加えて、30分の問題。







おわりに



そのような些細なことを忘れないでください。 それらは非常に迅速に(特にUnity3dで)行われ、プロジェクトには多くの利点があります。



PS:はい、gamedevコンテストやテストタスクでグラフィックスは重要ではないと言うときは信じないでください。 グラフィックス-ゲームプレイが独創的でない場合は非常に重要です(非常にまれですが、すぐに目立ちます-こんにちはノッチ)。 さらに、それは非常に迅速に行うことができ、プロジェクトははるかに完了したように見えます。



PPS:もう1つ:興味がある場合は、このプレゼンテーションを確認してください 。 広告なし:私は人生で初めてそれらの人に会います。 しかし、彼らはそれを言う。



PPPS:彼らはその会社を採用しませんでした。 したがって、私は何が起こったかへのリンク投稿します。 原則として、私は実装が好きです-物理をもう一度やり直して(またはこれを条件に合わせて)数十のレベルを実行し、ポータルUnityでゲームを統一しようとします。



建設的な批判を常に受け​​入れます。



All Articles