Unityで簡単な3次元のおもちゃを2日間で作る方法





私たちのハッカソンで最も印象的なプロジェクトは、スカイエンアクションです。 著者がイベントの前夜に彼​​のアイデアを提示したとき、2日間でそれが労働条件にもたらされるとは信じていなかった。 それにも関わらず、以前はお互いにもUni​​tyにも慣れていなかった3人の開発者のチームがタスクにうまく対処しました。 どうだったか教えてください。



アイデア



アプリケーションを作成するとき、ほとんどの場合、それらをゲーム化し、ゲームのいくつかの要素(成果、賞品、競争)を追加しようとします。 この場合、反対に進むというアイデアがありました。ゲームを基礎として、トレーニングの要素をすでに取り入れることです。







次第に、このアイデアは1分または数分の短いゲームサイクルで構築された3Dおもちゃの概念に結晶化しました。 これは何時間も固執するファークライではありませんが、すぐにどこかに行き、いくつかの単語を訓練し、あなたのビジネスをやり直す能力です。 玩具は、ボットではなく、人と1対1のネットワークでなければなりません。 最初から最後まで馬鹿げて全体を駆け抜けることができる3次元の迷路、または単語を正しく覚えていれば、カットできる特別なゲートを見つけることができます。 したがって、勝者は言葉をより速く、より正確に想起する人です。同じスコアで、仮想空間でより速く「走る」人です。



ハッカソンの限られた時間を考えると、ロジックと1つのレベル(後で新しいものをすばやく追加できる機能)を作成することが決定されました。 デモ用の言葉をゲームに直接縫います(Skyeng APIの接続などの外部タスクに気を取られないようにするため)。 現時点では、バックエンドを拒否し、プレーヤーをローカルネットワーク上で互いに直接接続します。ローカルネットワークでは、一方がサーバーとして機能し、もう一方がクライアントとして機能します。



チーム



3人がSkyengアクションチームに参加しました。2人がコード化され、3番目が設計レベルです。 さらに、メニューのデザインを手伝った4人目の「フリーランス」の2Dデザイナー。



ハッカソン前のこれら3人の開発者は、個人的に知り合いであっただけでなく、すべてが行われたツールを実際に使用した経験もなかったことは注目に値します。 このアイデアの著者は学校で非常に長い時間おもちゃを書いていました。cUnityは余暇に数日を選び、Javaでプログラミング経験がありましたが、C#ではありませんでした。 2番目の開発者はC#の経験はありましたが、ゲームはしていませんでした。 まあ、レベルデザイナーは似たようなことをしませんでした(UnityとC#の経験のない開発者)-彼はチームなしでハッカソンに到着し、その場で参加しました。







その結果、Skyeng Actionを作成するプロセスは、ゼロから構築された本格的なチームワークという結果ほど刺激的ではないことがわかりました。 誰もがプロジェクトの一部に従事しており、そのアセンブリはプレゼンテーションの前夜の深夜に行われたことを考えると、少なくとも面白かったです。 午前2時に1台のモニターで空中に長方形が急上昇し、2番目にコードの断片が、3日に静止画像のセットが見られる同僚は、このプロジェクトが思い浮かぶとは思わなかった。 しかし、すでに3時ですべてが機能し、プレゼンテーションでこれらの同僚は大いに驚きました。







装置



最初から2日間で3Dおもちゃを書くことは不可能な作業です。 幸いなことに、Unityには、標準コンポーネントのライブラリとアセットストアの両方に、シンプルで直感的なレベルエディターと膨大な数の既製のアセットが含まれています。 Unityを使用すると、必ずしも理想的ではないが、少なくともプロセスのロジックを示す既製のコンポーネントを使用して、ゲームの最小機能バージョンであるMVPを迅速に構築できます。 たとえば、同じドアを自分で行うのはそれほど難しくありませんが、このタスクは貴重な時間を浪費します。 既製のオブジェクトが使用され、ジオメトリ、開く速度、方向、テクスチャが異なります。 その結果、ゲームロジックといくつかのユニークな要素は独立して記述され、オブジェクトの環境と相互作用はライブラリから取得されました(Nature Starter Kit 2、Character Pack:Free Sample、FirstPersonCharacter)。 ネットワークプレイでは、Unityで使用されていたものも使用されました。1つのアプリケーションのクライアントとサーバー。 一方のコンピューターでは、ローカルネットワーク経由でメッセージを送信するサーバーが起動し、他方では、このメッセージを待機するクライアント(NetworkDiscovery、NetworkManager、NetworkIdentity、NetworkTransformの組み込みコンポーネント)が起動します。



それでも、プロジェクトの作業は既製のアセットをバスケットにドラッグすることに限定されませんでした。 約1000行のコードが記述されました。 自分のオブジェクトの1つは、ドアに取り付けられ、言葉でパズルを示すタブレットでした。







以下に、その動作を定義したコンポーネントのコードの一部を示します(プレーヤーに関連付けられていないカメラへの制御の転送を実装し、タブレットに移動します)。



// playerCamera - ,    // flyingCamera - ,     // source -     // target -     // positionSource -     // positionTarget -     // tablet - ,    .    -   . // spaceBeforeTablet -        float spaceBeforeTablet = 0.5f; playerCamera.gameObject.SetActive(false); flyingCamera.gameObject.SetActive(true); Vector3 source = flyingCamera.transform.forward; //           . //             , //    ""  .      . //    -    180 .       -  -90. Vector3 target = Quaternion.AngleAxis(90, Vector3.up) * tablet.transform.forward; Vector3 positionSource = flyingCamera.transform.position; Vector3 positionTarget = tablet.transform.position - target * spaceBeforeTablet; StartCoroutine(MoveCamera(flyingCamera, source, target, positionSource, positionTarget, null));
      
      





Unityのコルーチンは、複数のフレームが続くプロセスです。 タブレットに対するカメラのアプローチは、そのようなプロセスの1つです。



  public IEnumerator MoveCamera( Camera camera, Vector3 source, Vector3 target, Vector3 positionSource, Vector3 positionTarget, Camera cameraToActivateInTheEnd) { float animationStart = Time.time; float animationEnd = animationStart + cameraAnimationDuration; while (Time.time < animationEnd) { float phase = (Time.time - animationStart) / cameraAnimationDuration; camera.transform.forward = Vector3.Lerp(source, target, phase); camera.transform.position = Vector3.Lerp(positionSource, positionTarget, phase); yield return new WaitForEndOfFrame(); } camera.transform.forward = target; camera.transform.position = positionTarget; if (cameraToActivateInTheEnd != null) { flyingCamera.gameObject.SetActive(false); cameraToActivateInTheEnd.gameObject.SetActive(true); } }
      
      





プレーヤーに関連付けられたカメラへの移行でフライバックします。



  Vector3 source = flyingCamera.transform.forward; Vector3 target = playerCamera.transform.forward; Vector3 positionSource = flyingCamera.transform.position; Vector3 positionTarget = playerCamera.transform.position; StartCoroutine(MoveCamera(flyingCamera, source, target, positionSource, positionTarget, playerCamera));
      
      









結果



まとめると、次の点に注意できます。



-チームメンバーは、これまでに経験したことのないまったく新しいツールに慣れました。 「ハッカソンは森林でのみ同じ仕事です」という状況を完全に回避することができました。



-Unityと特定の熱意を使用して、3次元アプリケーションとゲームのプロトタイプを迅速に作成する機能が実証されました。



-簡単に開発および保守できる便利な教育コンテンツを備えたシンプルなおもちゃのMVPバージョンが提供されました。



-プレゼンテーションですごい効果が達成されました。これは、2日間でこのようなカラフルな画像を達成できるとは誰も予想していなかったためです。



しかし、最も重要なのは、これらすべてがハッカソンで実際に会った人々によって行われ、チームワークを迅速に確立することができたということです。



そして、私たちは私たちのチームで常にクールな人々を探していることを思い出させます!








All Articles