テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

はじめてゲーム開発する前に知っておくべきこと

「ゲーム開発を初めた時、大体躓くケースって似てるなー」と思ったら、素晴らしい動画があったので、この動画に自分の経験も混ぜた物をココにメモします*1

元動画は本当に素晴らしいので、是非一度見るのをお勧めします
なお、ピンポイントで日本語字幕のみありません。日本語版も公開されました。

www.youtube.comHow to Start Your Game Development - Unity

 

 

ゲーム開発を始める前に

多くのゲーム開発初心者は、ゲームを作ろうと色々やったあと最初のゲームを作り終わる前に止めてしまいます
この大体の理由は、満足できるようなゲーム作りの経験は得られない、何の成果も出せなかったといった理由です。

これは、そんな泥沼に陥らないための幾つかのアドバイスです。

f:id:tsubaki_t1:20180730195826j:plain

 

小さな目標から始める

ゲーム開発を始める前に知っておくべき最初のポイントは、スコープです。
大体の場合、ゲームを作り始める時に自分がプレイしているゲームを作ろうと夢見ます。これは悲しいことに大抵は不可能です。

例えばゴッド・オブ・ウォーやファイナルファンタジーといった「プレイされている」ゲームは、最低数十人の開発者達(もしくはもっと多くの)が、数年の時間をかけて作ります。
もし自分が本当に凄い人で、人生を捧げて開発したとしても、本当に欲しい物は作れないでしょう。特に、それが最初の試みであれば

f:id:tsubaki_t1:20180730210205j:plain

どんな目標が良いか?
最初のゲームは例えファミコンスーパーマリオであっても難しいでしょう。その内の1ステージでも難しいかもしれません。

はじめてのゲーム開発の目標は、最低限プレイ可能なものを設定してください。出来るだけ早く、最も初歩的に作れるものを目標にします。

その際に期限を設定するのは多くの人が良いアイディアと認めています。まずは一日で作れる物を一週間以内に作り切るのを目指すくらいが良いと個人的には思います。

最初に作るものは練習と考えてください。最初から大きなプロジェクトから始めると、何処から手をつけていいか分からなくなります。

  

この辺りの説明は、How to Scope Small and Start Right - Unityがオススメです。

f:id:tsubaki_t1:20180730210306j:plain

また迅速・初歩的な…にも理由があります。

多くの作り込み作業を停滞させます。細かい所が気になると特に。
それは作業を進めても進捗が無いように感じてしまいます。
また解決方法が分からない問題にぶつかりますし、
これから何をすればよいのか分からなくなるでしょう。

シンプルでも良いです。まずは完成することが大事です。
f:id:tsubaki_t1:20180730210419j:plain

出来たソレは、作るのに3週間かかった、当たり判定がガバガバの、出来の悪い横スクロールアクション。それを残念なゲームに見えるかもしれません。

しかし、それは誇れる成果です

間違いなくゲームを作ったし、大抵の人が出来ない事をやり遂げたのです。

f:id:tsubaki_t1:20180730210629j:plain

作ったゲームはぜひ友人にプレイしてもらってください。
ただまぁ、もし友人からの感触が余り良くないかもしれませんが、気にしないでください。普段プレイしている物と比べて予算が少ないので仕方のないことです。

これがどれ程難しいことを達成したかを自分自身はわかっていますし、何より次はもっと短時間に、面白いゲームを作れるようになっています。
そのうち「次のゲームまだー?」と言わせてやりましょう。

f:id:tsubaki_t1:20180730210502j:plain

 

自分に出来ることを使う

次のポイントは少し奇妙に思うかもしれませんが、特別なアイディアを持ってゲームを作成しない事、そして自身が何を出来るのかを理解しスキルに合わせてゲームの設計を決める事、この2つです。

 

「特別なアイディアの実現」は誰もが行いたい事ですが、それは思っているよりも難問です。最初はこの問題に数週間・数ヶ月悩み続ける事よりも、出来ることを増やす方が大体良いです。

むしろ出来ると確信できる手札でゲーム設計を進めてください。
まぁ何箇所か、まだ出来ない・分からない内容があっても大丈夫です。学習しながら進める事も出来るでしょう。ただし、分からない部分が「数箇所」を超えないように注意します。

f:id:tsubaki_t1:20180730211158j:plain

出来ることを増やすには、チュートリアル動画やマニュアルを見るのが良いです。そして分からないことがあれば、フォーラムや掲示板で質問してみてください。思っている以上に助けてくれる人が多い事に驚きます。

Unityお学びグループ - Unity Connect 学んでる事を報告したり相談する
Unityユーザー助け合い所公開グループ | Facebook 相互助け合い所
Unityのエラー・バグ・問題の解決方法|teratail 質問場所

 そしてコーディングを恐れないで下さい。コーディングを嫌いと思う人は結構多いと思いますが、実際やってみるとイメージしてたよりコーディングは少なかったりします。
勿論それが全てではありません。小さいことから出来ることを増やしていきます。

f:id:tsubaki_t1:20180730211257j:plain

あとは自身の持つスキルに基づいてゲームを設計します。
例えば、図を描くのが得意だけど一度もコーディングした経験がない場合、アート面を中心にゲームを開発します。コーディングは最低限で良いかもしれません。
逆にグラフィックやモデリングを得意としない場合、最小限のグラフィックでゲームを作るのも面白いかもしれません。そういったゲームも結構あります。*2

出来ること・出来ない事はあるかもしれませんが、意外と制約がある方が創造的だったりします。

f:id:tsubaki_t1:20180730211342j:plain

もしコーディングする時間やゲームに必要なアセットが無い場合は、アセットストアを使うのも良いかもしれません。

 

あきらめない

最後に大事なことは、あきらめない事です。

本当に多くのことが開発中に割り込んできます。殆どの人は仕事や学校の合間にゲームを作成することになります。そして非常に簡単にエタります*3

f:id:tsubaki_t1:20180730211709j:plain

開発は大変です。それは間違いないです。
ただ一つ言える事は、価値のある事はほとんどが大変であるという事です。

そのうち仕事や勉強の代わりにゲームを作るのが仕事になるかもしれません。その未来は、自分が諦めなかったたかどうかです。

f:id:tsubaki_t1:20180730215907j:plain

スケジュールや目標設定、モチベーション維持については、 Setting (and Keeping) Production Goals - Unityが素晴らしいです。

 

関連

作った後の「面白さ」を知るためのポイント
ココから申請(無料)

entry.cgworld.jp以前に書いたやつ

tsubakit1.hateblo.jp

*1:つまり翻訳記事ではありません

*2:Thomas was aloneは名作。

*3:【エタる】エターナる。永遠の未完になる。更新が途絶える、開発打ち切り

【Unity】ShaderGraphで頂点シェーダーを使用してみる

Unity 2018.2から使用できるShaderGraph 3.0から頂点シェーダーの機能が使用できるようになったので、使ってみました。

 

 

ShaderGraph3.0

これを動かすには、ShaderGraphとLWRPを3.0に上げる必要がありました。

f:id:tsubaki_t1:20180728225109j:plain

Unity 2018.2のShaderGraph 3.0から、マスターノードにはPositionという新しい項目が追加されました。この項目が頂点一つ一つの座標になります。

f:id:tsubaki_t1:20180728222500j:plain

なので、この頂点情報にCos(Time)の分だけ座標を上下してやれば、上下に玉が動くと、そんな感じです。

 

とりあえず上下に移動するだけのシェーダーを作る

まずは頂点シェーダーの動作を確認する為、オブジェクトが上下に動くだけのシェーダーを作ってみます。

 

まず、特に何もしていない状態です。
Position(Object)で取得した座標を、そのままPositionへ出力しています。

f:id:tsubaki_t1:20180728222730j:plain

時間で上下するベクトルを作ります。
float3(0, cos(_Time.x))な感じです。

f:id:tsubaki_t1:20180728222815j:plain

頂点の初期座標と、時間で上下するベクトルを加算して、最終ノードに出力するようにします。

f:id:tsubaki_t1:20180728222910j:plain

これでオブジェクトが上下に動くシェーダーが出来ました。

f:id:tsubaki_t1:20180728225230g:plain

f:id:tsubaki_t1:20180728225221j:plain

 

なお、動くのは頂点だけでバウンディングボックスは動いてないので、あまり上下に動かすと途中で消えたりするので注意です。

 

旗も作ってみる

ともちゃラボさんの記事を参考に、旗の動きとかも作ってみました。
コードをそのままシェーダーグラフのノードに書き直したら動いた感じです。

f:id:tsubaki_t1:20180728223319j:plain

f:id:tsubaki_t1:20180728220717g:plain

nn-hokuson.hatenablog.com

感想

結構簡単に頂点シェーダーでモデルを動かすことが出来ました。

ShaderGraphで色を色々試行錯誤するよりは、完成形ありきで作る感ありますが、中々に楽しいです。

【Unity】チュートリアルやデモ作成に使えるかな? ゲームの動きをTimelineで再現する方法

f:id:tsubaki_t1:20180726230124g:plain

前回はRigidbodyの動きをTimelineに格納することで、物理演算の負荷軽減やタイミングの調整などを行いました。
今回はゲームの動きをAnimationClipとして格納しておき、Timelineで再生してみます。

 

 

ゲームの動きを再現したい

ゲームのチュートリアルやオープニングで、キャラクターの「本来の動き」を実際に表現したいといったケースがあるかもしれません。
例えばスーパーマリオワールドのオープニングを見ることで、ソレがどんなゲームなのかひと目で分かります
また、してもらいたい動きを見せる事でゲームの楽しみ方を理解してもらいやすくなる効果もありそうです。

www.youtube.com他にも攻略法が分からないステージでのゴーストランナーや操作チュートリアルなど、色々と使えそうです。

また、単純にTimelineで茶番劇を作る際、動きを作るのが面倒ならキャラクターを操作し、動きをAnimationClipとして保存するといった手もあるかもしれません。

 

やり方

やり方は単純、昨日の内容と同じような感じです。

tsubakit1.hateblo.jp

  1. 動かすキャラクター、及び動くオブジェクト郡を全てRecorderで指定します。
    動くかもしれないコンポーネントを全て指定します。
  2. Start RecordでプレイをAnimationClipに格納します。

f:id:tsubaki_t1:20180726233239j:plain

あとは前回同様、AnimationClipをTimelineに登録して、Recorderで指定したキャラクターをTimelineで動かします。

f:id:tsubaki_t1:20180726233409j:plain

 

再現できるのはInspectorに出ている項目のみ

さて、この機能で再現できる項目ですが「Inspectorに表示されている項目のみ」という制限があります。要するに、内部で持っているパラメーターなどは再現できないという事です。

このため、「ボタンを押したら弾が出る」的なアクションの場合、「ボタンを押した」という状態をTimeline側で再現できないと、弾を出すのが難しいです
(弾をオブジェクトプールしている場合、プーリングしてるオブジェクトをキャプチャすればOKという話もあります)

 

またUIの動きをキャプチャして再現する場合、「UIの動き」や「動きの結果の変化」といった項目はTimelineで再生出来ますが、フォーカスが当たった事による色のTweenといったプロパティ制御されていて表面に出てこない項目は反映されていません。

https://user-images.githubusercontent.com/1644563/43270903-2627e516-9131-11e8-8c35-7b194dc9fb6b.gif

 

3Dの場合はOptimized Game Objectをしてると使えないかもしれない

3Dの場合ですが、Optimized Game Objectを設定していた場合、キャプチャすべきボーン情報が取れず再現出来ないかもしれません。
Optimized Game Objectを解除すればキャプチャ出来ると思います

なおキーの数が結構凄いことになるかもしれないので、余りに長いモノは避けるか、キャプチャするフレームレートを下げるのが良いかもしれません。

 

ビルド後のゲームでキャプチャは出来ない

このアプローチはあくまでも「チュートリアルシャドウラン等の動きを保存する」ものですので、例えばレーシングゲーム最速シャドウランを再現するといった用途には使えません

そちらは「リプレイ」等のキーワードで探すのが良さそうです。

【Unity】Timelineで物理演算のような動きを使いたい

https://user-images.githubusercontent.com/1644563/43196798-1c92cc20-9044-11e8-8762-806e2d9415c5.gif

今回はTimelineで物理演算のような動きを再現するアプローチについてです。

 

 

物理表現的な動きをTimelineで使いたい

Timelineで簡単な動画を作成していると、物理表現的な表現を使用したくなるケースが多々存在します。
例えば玉が跳ねるであったり、扉が壊れるであったり、揺れモノであったり。

そういった表現を作る場合はアニメーションでカーブを作る必要があるのですが、コレが結構面倒くさいです。
本当にごく単純なアニメーションなら楽で良いのですが、少しでも複雑になると手間が大幅に増える他、簡単に不自然な動きになります。

f:id:tsubaki_t1:20180723204959j:plain

 

ではTimelineでの制御を止めてコンポーネント単位で動かそうとなる訳ですが、3つ問題があります。

1つ目は物理演算は毎回確実に同じ動きをする訳ではないという点です。端末のCPUやFPS遅延の有無によって多少結果が変動します。

またTimelineでのプレビューが出来ない点も問題です。もし物理演算的に動くナニカが演出の重要な項目を担っている場合、その動きと演出のタイミングを合わせるのは至難の業です。

パフォーマンス的な点もあります。位置情報を読み取るだけのアニメーションと比較して、物理演算は多くの計算を必要とします。その物理演算で動かす対象の量がとても多かった場合、その演出には非常に高い負荷が発生してしまいますし、事前に用意するコストも地味に大きいです。

 

物理演算の動きをAnimationClipに変換してしまおう

そこで思いつくのが、物理演算的な動きをAnimationClipに変換してしまおうというアイディアです。
AnimationClipに変換することで幾つか出来ることがあります。

  • 物理演算の「動き」のみを再現出来る
  • RigidbodyやColliderは不要
  • Timelineでプレビュー出来る
  • 量によるが普通に物理演算するより軽い

勿論、物理演算のようなインタラクティブな反応を返す事は出来ませんし、物理演算の結果「期待したような動きにする」事は難しいかもしれませんが、やって見る価値はありそうです。

f:id:tsubaki_t1:20180725123056j:plain

 

 GameObjectの動きをレコードする

AnimationClipに変換するため、GameObjectの動きをレコードします。
これはGameObjectRecorderというAPIがあるのですが、AssetStoreにあるRecorderでも対応する機能があるので、今回はそちらを使用します。

assetstore.unity.com

まず最初にTimelineで動かしたいオブジェクトを用意します。
このオブジェクトは親オブジェクトを用意しておくと、あとで色々と楽です。

なお、子オブジェクトは全てユニークな名前を指定する必要があります。オブジェクトのバインドは名前単位で行うので、同じ名前は使えません。
逆を言えば、オブジェクトを差し替えるときに名前さえ一致してれば何とかなるという話でもあります。

f:id:tsubaki_t1:20180725123520j:plain

 

次にTools > Recorder > AnimationClipsでウィンドウを開き、
GameObjectに先程用意した親オブジェクトを登録します。

複数のオブジェクトを登録したい場合はAdd Object To Recordでレコードしたいオブジェクトを増やします。

f:id:tsubaki_t1:20180725123614j:plain

f:id:tsubaki_t1:20180725123720j:plain

また、Transform以外もレコードしたい場合はRecordedTargetsで複数選択します。
なお、ココで指定できるのは「子オブジェクトも含めた全てのコンポーネント」です。

f:id:tsubaki_t1:20180725123945j:plain

あとはStart Recordingボタンを押せばレコードが開始され、Stop RecordingでAnimationClipがプロジェクトに生成されます。

f:id:tsubaki_t1:20180725124526j:plain

動きに問題が無さそうなら次のステップです。

 

Timelineに使用する

次にTimelineにバインドします。

手順は単純で、Recorderで保存したオブジェクトをTimelineに登録するだけです。

f:id:tsubaki_t1:20180725124816j:plain

 

Rigidbodyとか、その辺りを全て外す

Timelineで動くのが確認出来たら、最後にRigidbodyやColliderも外してしまってOKになります。
完全にTimelineで動くオブジェクトに物理演算の動作は不要なので外してしまいます。
もしくはIsKinematic。
これは動かすオブジェクトの量が多い場合、パフォーマンスを劇的に改善します。

 

注意

Humanoidに使用する場合

このアプローチ、少し考えればラグドールに使ってしまおうと考えるかもしれません。
物理演算を使用せず単純なアニメーションでキャラクターの転倒を再現するのは非常に低負荷であり、地形に沿ってキャラクターが倒れる必要がない場合は、それはたしかに有効そうな手に見えます。

下はラグドールをアニメーションに変換して再生したもの

f:id:tsubaki_t1:20180725130606g:plain

例えば120体のラグドールを全てAnimationClipでキャプチャして直した場合、ラグドール(右)が5~10msかかったのに対し、アニメーション(左)の場合は概ね0.5ms以下に収まっています。

f:id:tsubaki_t1:20180725130035j:plain

ただ注意すべき点として、このアプローチで取得できるキャラクターのアニメーションはGenericタイプであるという点があります。そのためキャラクターのリグがHumanoidの場合は互換性がありません。

また常に同じ動きをしてしまう関係上、死屍累々感はありません。
まぁ、ここまで規則正しく並べなければそうでもないとは思いますが…

f:id:tsubaki_t1:20180725130425j:plain

 

キーフレームの数が結構凄いことになる

もう一つの問題は、キーフレームの数が結構エグい事になる点です。
Unityのリダクション機能も使えないですし、カーブで補完してくれる感じではないので、ちょっと注意が必要かもしれません。
初期設定では60FPSでレコードするので、30FPS辺りにすると結構良い感じに減りそうです。

 

感想

作るのが面倒だった(上手くリアルな感じで作れなかった)物理演算的な動きを、手抜きして作る方法についてでした。

 

関連

 Timelineのプレビューのみで物理演算を再生するアプローチです。
求める結果を得るために試行錯誤する場合に使えます。

tsubakit1.hateblo.jp

画面を録画出来るRecorderです。かなり便利

tsubakit1.hateblo.jp