- 投稿日:2020-02-16T23:30:30+09:00
ほしゆきトゥーンシェーダーの特徴
ほしゆきトゥーンシェーダーの特徴
だいぶ遅れましたが、紹介します。
作り始めたきっかけ
もとは2017年に制作していた自作ゲームで使われる予定だったが、諸事情により制作は中止。
お蔵入りするのももったいないと考え、同じ年の冬にGithub上に公開をはじめ今に至る。ちなみにそこで起こっていたことは....
「なんか暗くね...。」
「今度は光りだした」
「おお、標準アセットのトゥーンシェーダー意外にいけるやんけ」
「....」
(ちなみに画像はハードディスクの奥底からプロジェクト立ち上げて作った。再現きつかった...)
特徴
グローバルイルミネーション
Unityがいかにグローバルイルミネーションによる品質向上と効率化を謳っても、トゥーンシェーダー上ではうまくあつかえなかったりする。
ほしゆきトゥーンシェーダーでは、アンビエントライトに似た手法で解決。
また、Proxy Light Volumeやライトマップ、焼きこみにも対応しています。
HDRと好相性
物理ベースマテリアルと同じく、直接光や間接光からの光がそのままモデルの明るさとなる。
そのため周囲の明るさに自然にと馴染み、ブルームやトーンマッピングで四苦八苦する時間が、50%以下。セットアップが簡単
トゥーンシェーダーにありがちな、レイヤー分けやモデルの加工などの事前準備も不要。
また、マテリアルのパラメーターも多くなく、標準マテリアルやMMDのものと近いため移植や調整が簡単におこなえます。我慢や忍耐に対する反論としても有効。
シェーダーカスタマイズも可能
「キャラにエフェクトを追加してほしい」
こんな単純明快な要求から、コード解析を伴う複雑な作業に発展していくことがありえます。付属のシェーダーはサーフェイスシェーダーによって実装されていて、右クリックで新しく作成することも可能。
また、いくつかの処理は関数化されており、機能の一部を既存のシェーダーに組み込むことができます。
今後の予定
基本設計が最新のものでも2018年であるがゆえにShader GraphやVFXなどの新機能との連携に課題がある。
今後は、LWRPやHDRPとの連携や、専用のレンダリングパイプラインの開発などを検討していく予定。
ダウンロード
- 投稿日:2020-02-16T23:19:22+09:00
UnityのTileMapのすき間が大きく空いてしまう場合の調整方法
UnityのTileMapを使用してマップを作成する際に、ブロックとブロックの間が空いてしまう問題の解決に時間がかかったので備忘録としてメモ。
タイル同士のすき間が1ピクセル空いてしまうような問題はググると解決策が色々でていたのですが、自分が探していたのは違う問題でした。
原因
画像のSpriteModeはMultipleで、Pixel Per Unitを16にしていました。
SpriteEditorで、CellSizeは8にしていました。
この状態だとタイルマップを敷き詰めた時に1ブロックに対して半分くらいの大きさになってしまっていました。解決方法
SpriteEditorのCellSizeの8は正しい設定だったので、Pixel Per Unitを8に修正しました。
この状態だとタイルマップをシーン上に並べた時に、想定しているブロックのサイズの2倍になってしまいました。
この大きさの調整は、ヒエラルキー上にある、タイルマップのScaleをx:0.5、y:0.5に設定したところ、意図した大きさになりました。
どこの値を変更するのかがわからずに地味に時間がかかってしまいました。追記
テラテイルのアカウントを持っていないので回答していませんが、本記事と同じ問題を抱えている人が少なくとも1人はいたようなので記事にしました。
Unity TileMap・Tile Paletteを使ってタイルを隙間なく並べる方法
※2020年2月16日時点で回答がついていませんでした。
- 投稿日:2020-02-16T23:12:42+09:00
VulkanをサポートしたOculus QuestでVisual Effect Graphを使う
はじめに
Unity2019.3になってOculus QuestでVulkanがサポートされました。
更にURP 7.2.0からXR周りが改善されたりXR Interaction Toolkitだけでクロスプラットフォームにカメラリグやコントローラーを扱えるようになっています。
- Vulkan Support for Oculus Quest in Unity (Experimental)
- 2019.3 Release - XR Updates
- XR Interaction Toolkit Preview Package is here
- XR Interaction Toolkit Preview Release
そこでUnityとPackage Managerの機能だけで外部アセットを使わずにOculus QuestでVisual Effect Graphを使ってみます。
できあがったもの
スクリーンショットと動画
ソース
ビルドしたapk
開発環境
- Unity2019.3.1f1
- Android Build Support
- Android SDK & NDK Tools
- OpenJDK
- Oculus Quest v13以上
Unityインストール時にAndroid Build Supportを展開してAndroid SDK & NDK ToolsとOpenJDKもチェックします。
手順概要
- 新規プロジェクト作成
- Oculus Quest向けにProject Settingsを変更
- Package Managerから必要なパッケージを追加
- VisualEffectGraph Additionsをインポート
- シーン構築
- ビルドと実行
- クオリティ調整
新規プロジェクト作成
UnityHubで新規作成してUniversal Template Projectから作成します。
Oculus Quest向けにProject Settingsを変更
Androidプラットフォームに変更
- メニューの
ファイル > ビルド設定
を開き、プラットフォームからAndroidを選択してSwitch Platformボタン
を押します。Oculus Quest向けにProject Settingsを変更
- Build Settingsの
プレイヤー設定ボタン
を押してProject Settingsを開きます。Player > Androidアイコン > その他の設定を開きます。
- Graphics APIsをVulkanのみに変更
- 最低APIレベルを4.4から6.0に変更
XR Plugin Managementを開きます。
- Install XR Plugin Managementボタン、Oculus XR PluginのInstallボタンの順に押します。
- AndroidアイコンのPlugin ProvidersにOculus Loadersを追加します。
Oculusを開きます。
- 作成ボタンを押してOculus Quest用の設定を作ります。
Package Managerから必要なパッケージを追加
- メニューの
ウインドウ > Package Manager
を開き、Advanced
からShow preview packages
をチェックしてプレビューバージョンを見えるようにします。プロジェクト内をすべてのパッケージに変更して以下のパッケージをインストールします。
- XR Integration Toolkit
- Visual Effect Graphの7.2以上
- Universal RPの7.2以上
- Android Logcat
VisualEffectGraph Additionsをインポート
Package ManagerのVisual Effect GraphからVisualEffectGraph Additionsの
Import into Projectボタン
を押します。
Assets/Samples/Visual Effect Graph/7.2.1/VisualEffectGraph Additions/VFX/
にアセットが作られますがそのままでは動かないのでメニューの編集 > Visual Effects > Rebuild All Visual Effect Graphs
から再コンパイルします。シーン構築
メニューの
ゲームオブジェクト > XR > Room-Scale XR Rig
を選択するとMain CameraがVR用のXR Rigに変換されます。
Assets/Samples/Visual Effect Graph/7.2.1/VisualEffectGraph Additions/Prefabs/
にあるVFXのプレハブをヒエラルキーに追加します。追加したVFXをカメラから見やすい位置に調整します。
ビルドと実行
- メニューの
ファイル > ビルド設定
を開きます。- デバイスを実行しますからOculus Questを選択します。
- ビルドして実行ボタンを押します。
アプリを起動してメニューの
ウインドウ > 分析 > Android Logcat
を開くとVulkanが使われているのが分かります。クオリティ調整
このままでもVisual Effect Graphは動きますがBloomが弱いのでPCと比べると貧弱です。以下の設定を行うとBloomの違いが分かります。
ただしHDRとPostProcessingはOculusの開発者ブログでパフォーマンス低下させると指摘されているようにFPSが更に下がってしまいます。
Getting Started with Unity’s Lightweight Render Pipeline (LWRP)
クオリティ調整後のスクリーンショットと動画
ビルドしたapk
Assets/Settings/UniversalRP-MediumQuality.assets
をAssets/Settings/UniversalRP-OculusQuest.assets
に複製して以下の項目を変更します。
- HDRを有効にする
- Anti Aliasing (MSAA)を
4x
にする- Grading Modeを
High Dynamic Range
にする
Player Settings > 品質
にOculusQuestを追加して以下の項目を変更します。
- AndroidのDefaultに設定する
- Renderingに
UniversalRP-OculusQuest
を設定する- それ以外は
Medium
と同じ
Player Settings > グラフィックス
のスクリプタブルレンダーパイプライン設定にUniversalRP-OculusQuest
を設定します。その他
- 投稿日:2020-02-16T21:40:16+09:00
unityでとりあえずプレイヤーを動かすスクリプト
始めに
フライトゲームやFPSでプレイヤーを動かすスクリプトを書きました。
プレイヤーの動かし方が分からない人は必見です!
(これはmacで開発することが前提となっています)下準備
- unityのnewを選択
- Project nameを決めてCreate projectを押す
- Create -> 3D Object -> Planeをクリック、地面を作ります。
- Create -> 3D Object -> Cube、今回はこれを動かします。
- Cube -> Add Componentをクリック'Rigidbody'と検索Rigidbodyをクリックして追加する
- Main CameraをドラクアンドドロップでCubeに入れる
- ProjectのCreateからC#Scriptを選択してクリック
スクリプト
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player_controller : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if (Input.GetKey(KeyCode.UpArrow)) { transform.position += new Vector3(0,0,0.1f); } if (Input.GetKey(KeyCode.DownArrow)) { transform.position += new Vector3(0,0,-0.1f); } if (Input.GetKey(KeyCode.RightArrow)) { transform.position += new Vector3(0.1f,0,0); } if (Input.GetKey(KeyCode.LeftArrow)) { transform.position += new Vector3(-0.1f,0,0); } } }開いたプログラムの内容を全て削除して上のスクリプトをコピペしてコマンドSで保存。
unityに戻りこのスクリプトをCubeにドラクアンドドロップをする。
これで上の三角のボタンを押せば終了です。
もし、Cubeにスクリプトを入れられなかったらスクリプトを右クリック -> Remameを押して'Player_controller'と入れてみてください!最後に
最後まで見てくださってありがとうございます。
Qiitaは始めたばかりなので間違っていたら遠慮なく指摘してください!よろしくお願いします。
- 投稿日:2020-02-16T20:15:13+09:00
Unity での GC Alloc対策 ダイジェスト
はじめに
Unity2019からガベージコレクション発生時のスパイクを改善する機能[インクリメンタル GC]がリリースされました。
不要なメモリ確保によるガベージコレクション発生時のスパイクは回避可能かもしれませんが、
[マネージヒープの拡張が発生することによるメモリの枯渇]
&
[メモリが確保できなかった場合のクラッシュ]
に関しましては、[不要なメモリを確保しない]ことを意識しなければ、何れ発生します。今回の記事では、[不要なメモリ割り当て(GC Alloc)]を避ける為の方法を少々雑になりましたが要約いたしました。
皆様の役に立てますと幸いです。。。!ガベージコレクションおよびマネージヒープの拡張に関しまして
インスタンスの生成や文字列連結などの要因でオブジェクトが生成される際に[GC Alloc]が発生し、それにより確保されたメモリはマネージヒープという領域に割り当てます。
メモリを確保した際にマネージヒープの空きが存在しない場合、Unity側で下記処理を実行します。1.ガベージコレクションを実行し、マネージヒープ内の解放可能なヒープメモリの解放処理を実行します。
上記処理実行時にプログラム自体が一時停止(約 1ミリ秒未満~数百ミリ秒)する問題が発生します(俗に言う[スパイク])。
2.もしガベージコレクション実行後に、リクエストされたメモリ領域が確保出来ない場合は、マネージヒープが拡張されます。詳細はUnityのマニュアルの、下記リンクを参照。
マネージヒープガベージコレクション発生時のスパイクに関しましては、Unity2019から追加された[インクリメンタルGC]を使用することにより大きく改善されますが、マネージヒープの拡張自体は[不要なメモリ割り当て]を避けることを徹底し、極力避けなければなりません。
上記マニュアルに記載されている通り、
マネージヒープが拡張する際、そのマネージヒープに割り当てられたメモリページが解放されることは稀です。拡張したヒープの大部分が空であったとしても Unity は拡張したヒープを維持し続けます。
とある為、マネージヒープの拡張が繰り返し発生した場合、拡張する為のメモリが確保されず、ゲームがクラッシュします。List、Dictionaryのキャパシティーは事前に設定
List及びDictionaryは、コンストラクタに指定したキャパシティーの上限を超える値を追加した際に、
キャパシティーの上限が動的に追加されGC Allocが発生します。
事前に必要十分なキャパシティーを設定することを推奨します。ラムダ式の記述内容を気を付ける
ラムダ式内でローカル変数/関数やメンバー変数/関数を参照した場合、
該当するラムダ式のコードが実行される度にGC Allocが発生します。
キャッシュされるラムダ式の記述を行う、
もしくはインターフェースを使用し[System.Action]を使用しない実装に変えることによって回避可能です。GC Allocが発生するパターン
private int m_count = 0; private static int m_countStatic = 0; private void Update() { // ラムダ式内でメンバー変数を参照した場合、GC Allocが発生 InvokeAction(() => { m_count++; }); // ラムダ式内でローカル変数を参照した場合、GC Allocが発生 int count = 0; InvokeAction(() => { count++; }); // ラムダ式内でメンバー関数を参照した場合、GC Allocが発生 InvokeAction(() => { IncrementCount(); }); // ラムダ式内でメンバー関数を直接指定した場合も、GC Allocが発生 InvokeAction(IncrementCount); // ラムダ式内でstatic関数を直接指定した場合、デリゲートが都度生成される為GC Allocが発生 InvokeAction(IncrementCountStatic); } private void InvokeAction(System.Action action) { action.Invoke(); } private void IncrementCount() { m_count++; } private static void IncrementCountStatic() { m_countStatic++; }GC Allocが発生しないパターン
private static int m_countStatic = 0; private void Update() { // ラムダ式内でstatic変数を参照した場合、GC Allocは発生せず InvokeAction(() => { m_countStatic++; }); // ラムダ式内でstatic関数を参照した場合、GC Allocは発生せず InvokeAction(() => { IncrementCountStatic(); }); // ラムダ式内の引数を参照する場合も、GC Allocは発生せず InvokeRandom((int value) => { AddContStatic(value); }); } private void InvokeAction(System.Action action) { action.Invoke(); } private static void IncrementCountStatic() { m_countStatic++; } public void InvokeRandom(System.Action<int> action) { int rand = Random.Range(1, 100); action.Invoke(rand); } private static void AddContStatic(int value) { m_countStatic += value; }InGame中はコルーチンを極力使用しない
コルーチンの呼び出しを実行する際に僅かながらGC Allocが発生しますので(40Bほど)、
リソースの読み込みや初期化処理以外のInGame中の処理では実行しないほうが良いでしょう。
また、コルーチン内に[yield return 0]や[yield return new WaitForSeconds(float seconds)]実行時も
GC Allocが発生しますので、コルーチンを用いて時間待ち処理を実装する場合は、
[yield return null]とwhile文を組み合わせる方法を用いた方が良いです。
([yield return 0]はボックス化、[yield return new WaitForSeconds()]はインスタンス生成の理由によりGC Allocが発生)private int m_count = 0; private void Update() { // コルーチン呼び出しによるGC Allocが発生 StartCoroutine(CoroutineYieldReturnNull()); // コルーチン呼び出し+ボックス化によるGC Allocが発生 StartCoroutine(CoroutineYieldReturnZero()); // コルーチン呼び出し+インスタンス生成によるGC Allocが発生 StartCoroutine(CoroutineWaitForSeconds()); } private IEnumerator CoroutineYieldReturnNull() { yield return null; m_count++; } private IEnumerator CoroutineYieldReturnZero() { yield return 0; m_count++; } private IEnumerator CoroutineWaitForSeconds() { yield return new WaitForSeconds(1.0f); m_count++; }TextMesh Pro を用いたテキスト表示でのGC Alloc回避方法抜粋
[SerializeField] private TMP_Text m_textStringBuilder = null; [SerializeField] private TMP_Text m_textNumber = null; [SerializeField] private string[] m_addTexts = null; private int m_index = 0; private StringBuilder m_stringBuilder = new StringBuilder(100); // Update is called once per frame private void Update() { m_stringBuilder.Clear(); m_stringBuilder.Append("<color=#00FFFF>[Non Alloc]<color=#FFFFFF>SetText Add Text:"); m_stringBuilder.Append(m_addTexts[m_index]); //----------------------------------------------// // StringBuilder.Append(int value)を実行した際に // Append関数内で[int.ToString()]が実行される為 // GC Allocが発生します // https://docs.microsoft.com/ja-jp/dotnet/api/system.text.stringbuilder.append?view=netframework-4.8#System_Text_StringBuilder_Append_System_Int32_ //----------------------------------------------// //mStringBuilder.Append("Index:"); //mStringBuilder.Append(m_index); // TMP_Text.SetText()+StringBuilderを使用することにより、GC Allocを発生せずに文字列連結+表示が可能 // TMP_Text.SetText() によるGCは実機では発生しません m_textStringBuilder.SetText(m_stringBuilder); // TMP_Text.SetText()+int/floatを使用することにより、GC Allocを発生せずにint/float型の文字列連結+表示が可能 // TMP_Text.SetText() によるGCは実機では発生しません m_textNumber.SetText("Index:{0}", m_index); m_index = (m_index + 1) % m_addTexts.Length; }文字列及び配列を返すUnity標準のAPIは要注意
配列を返すUnity標準の関数(Physics.RaycastAll() など)や、
文字列及び配列を返すプロパティ(GameObject.name, Input.touches など)は十中八九GC Allocが発生します。
一度呼び出した後に値をキャッシュする、もしくはGC Allocが発生しない関数に置き換えることによって対処可能です。
(Physics.RaycastNonAlloc(), GameObject.CompareTag(), NavMeshPath.GetCornersNonAlloc() など)Profilerを使用したパフォーマンスチェックを実施
実装に区切りがついたタイミングで(リリース前のデバッグ期間ではこまめに)、Profilerを用いたパフォーマンスチェックを行いましょう。
Unity Editor上でも大まかなプロファイリングが可能ですが、[Unity Editor]限定で[GC Alloc発生]や[パフォーマンス低下]が発生するケースがありますので、
実機ビルドを作成してプロファイリングすることをオススメします。
実機ビルド作成時に[Build Settings]の下記項目を有効化することによって、
[Unity EditorのProfilerへの自動接続]+[実機ビルドでのDeep Profiling]がサポートされます。
1.Develop Build
2.Autoconnect Profiler
3.Deep Profiling Support
- 投稿日:2020-02-16T15:35:26+09:00
Unity ビルドした後xcodeのシュミレーターでアプリが落ちる現象
unity で開発していよいよリリース一歩手前
ビルドも成功していよいよアプリを開いたら。。。
真っ黒な画面ですぐにアプリが終了してしまってどうにもなりませんでした。エラーを見ると何やらグラフィックのとろこがまずいようでいろいろ悩んでみましたが
結果単純なことでした。グラフィックのmetalと言うのがios10.x以上じゃないと
サポートされてないとのこと。そこでios11にして再ビルド したところきちんとしたアプリで成功しました。
- 投稿日:2020-02-16T14:41:13+09:00
Unity入門:アニメーションコントローラーをプログラムでつけたい場合どうしたらいいのか?
1 . はじめに。(飛ばしてください)
最近Unityを本格的に触りだしたUnity初心者の「HARUK」です。今回は「プログラム側でアニメーションコントローラーをつけるコード」についてメモを書き残そうと思っています。Unityのプログラムを勉強するために簡単な横スクロール3Dゲームを作ろうと思っています。その中でプレイヤーが操作するキャラクターをプログラム側で生成し、そのキャラクターのモデルにアニメーションコントローラーを設定したいと思いました。画面の端に待機させておく。や初めからプレイヤーに見えないようにしておく。などヒエラルキーであらかじめ設定しておくという手段もあるのですが、後々のことも考えて今回はプログラムで制御する方法を学ぼうと思いました。
「勉強しているぞ!」ということを第三者にアピールするために日記としてつけていますが、もし同じところで困っている人がいたら見ていただければ幸いで
2 . プログラム
早速プログラムについて
実装方法について調べてみたところ、
こちらのページにソースコードが書かれていましたので参考にされていただきました。とてもわかりやすい。https://gametukurikata.com/basic/addcomponent
ソースコード
Animator m_animator; //ここでコンポーネント取得 m_animator = model.GetComponent<Animator>(); if (m_animator == null) { //モデルにアニメーターのコンポーネントを追加 m_animator = model.AddComponent<Animator>(); } //アニメーションコントローラーを関連づける。 m_animator.runtimeAnimatorController = Resources.Load<RuntimeAnimatorController>("PlayerController");これをプレイヤーのソースコードに付け加えるとうまく動きました。
次は背景をスクロールさせるクラスを作ろうと考えています。
3 . 最後に
趣味で3Dモデリングをやっています。
もしよければみてくれれば幸いです。
そして、できればお気に入りをつけてほしいな。
以上!
- 投稿日:2020-02-16T00:42:35+09:00
【中級者向けUnity講座】RPG編 part0 『企画を練る』
はじめに
皆様、初めまして。
個人でゲーム制作をしております、kenと申します。
この講座では、実際にゲームを作りながら「こういう事をするなら、こういう風にすると良いと思うよ。詳しくは自分で調べてね。」という感じで、ゲームの作り方、Unityの機能やアセット等を軽く紹介して行きます。今回は、個人制作向けの企画の練り方を私なりにまとめてみたいと思います。タイトル詐欺で、割と初心者向けの内容です。
企業向けのガチの企画書の書き方とかは、調べればいくらでも情報が出てくるので、ここでは割愛します。人それぞれ色々な考え方があると思うので、よろしければ、「自分はこういう風にしてるよ」等のコメントを頂けると嬉しいです。
企画を考える上で気をつける事
個人でゲームを作る上での注意点が分かりやすく纏められた記事をいくつか紹介します。
記事の目次を書いておくので、気になる項目があれば是非、引用元の記事を読んでみて下さい。
ゲーム制作の経験のある方であれば「せやな」と思う項目がほとんどだと思うので、読み飛ばしても大丈夫です。やってはいけないゲーム制作、初心者ほど要注意ベスト5
◆目次
・やってはいけないゲーム制作とは!?
・初心者ほど要注意!やってはいけない事ベスト5
┗1.いきなり大長編を目指す
┗2.いきなりグループ体制を取る
┗3.著作権を無視しまくる
┗4.デバッグに時間をかけすぎる
┗5.最初からすべてオリジナル素材で勝負する
・全て完璧なんか目指さなくてもよい
・これからの為に生かすゲーム制作これから個人でゲームアプリを作ろうと思っている人へ伝えたいこと
◆目次
・プログラミング未経験でも作れる?
┗必要なスキルは?
┗でも少しはプログラミングの勉強してから作り始めた方が良いよね?
┗絵も描けないし音楽についてもからっきしだけど大丈夫?
・必要なソフトウェアは?(Unity,Cocos2d-x)
・具体的な始め方は?
・どの程度の制作期間が必要?
・一人でも作れる?
・どのくらいの費用が掛かる?
・どれくらい儲かるの?
┗広告を貼りたい…
・誰も遊んでくれないか不安…
・どうやって宣伝すればいいの?
┗ツイッターもブログもやってないから宣伝できない…
┗プレスリリースは送ったほうが良い?
・その他の細かいこと
┗アイコンと紹介イメージは頑張って作ろう
┗アプリリリース後、DL数が伸びなくても落ち込まない
・最後に個人ゲーム開発者として生活していく方法
◆目次
1. どんなゲームを作るか
2. スタイルを考えてゲームを作る
3. たくさんゲームを作る
4. ゲーム以外のお金を稼ぐ方法を考えるスマブラのプロデューサーが考える、面白いインディーゲームの企画の仕方
◆目次
・盛り上がりを見せるインディーゲーム市場
・個人制作ながらメジャーゲームに転身することも
┗ゲーム業界を変えた「マイクラ」
┗バトルロイヤルの開祖、『PUBG』
・桜井政博が考える、売れるゲームの企画方法
┗インディーか、メジャーかはプレイヤーに関係ない
┗大事なのは、「好き」を貫いたゲームを作ること
・まとめその1.インプットをする
まずは、面白そうだと思う事をやってみたり、時間が無ければ調べてみたりしましょう。
アイデアは突然天から降りて来るものではなく、自分の過去の経験から生み出されるものです。とにかく沢山インプットしましょう。
自分の好きな事だけでなく、最近話題になっている事や、人気の出ているものにも手を出してみると、より効果的だと思います。その2.大体どんな感じのゲームを作りたいかを決める
ここでは、あまり深く考える必要は無いと思います。インプットが十分に出来ていれば、自然と「こういうゲームが作りたい!」という情熱が湧き上がってくると思います。どうしても決まらない時は、その1に戻りましょう。
ここで重要なのは、面白いかどうかとかは一先ず置いておいて、自分が作りたいかどうかを重視する事です。
ゲーム制作を始めると必ず色んな壁にぶち当たります。ぶち当たりまくります。私は1日に2、3回は心が折れてます。それを乗り越える為には、情熱が必要不可欠です。また、対象プラットフォームはなるべく早い段階で決めておいた方が良いです。プラットフォームによって考え方も作り方も変わってきます。
私はPC向けのRPGを作る事にしました。理由は、作りたいと思ったからです。
その3.そのゲームの面白さを列挙し、不要な要素を削る
ここではRPGを例に進めていきますが、自分の作りたいゲームに置き換えて進めて行って下さい。
RPGの面白さとは何でしょうか。
色々あると思いますが、私がパッと思い付いたのは以下の3つです。
・キャラ育成
・マップ探索
・シナリオ
まずは、この3つから削れる要素がないか考えてみましょう。キャラ育成のみに絞ればハクスラ系のRPGに、シナリオのみに絞ればノベルゲームになりますね。
この際、RPGで無くなっても大丈夫です。シナリオを作りたい気持ちが7割、他の要素が3割くらいなら思いきってノベルゲームに移行しましょう。個人で企業と同じ土俵に立っても絶対に勝てないので、なるべく要素を削って尖ったゲームにした方が良いです。私は、この3つからは削らない事にします。尖ったゲームにした方が良いと言っておいてなんですが、講座という都合上、なるべく色んな要素を実装したいからです。
その4.その3で決めた要素をどういう感じで実装するか考える
その3で決めた要素をどういう感じで実装するかなるべく具体的に考えていきましょう。この時に、どうやって実装するのかも同時に考えましょう。
まずは、キャラ育成から考えてみます。
キャラ育成には、まず何のために何を育てるのかを考える必要がありますね。
よくあるのは、『敵を倒す為にキャラを強くする』ですね。他にも『お店を大きくする為に利益を上げる』とか色々ありますね。
この時にオススメなのが、敢えて王道から外してみたり、逆の事をしてみると尖った企画が考えやすいです。
例えば、『敵を倒す為に』を逆にして『敵を倒さない為に』にしてみましょう。その為にプレイヤーは何をすれば良いでしょうか?敵を説得する為の材料を用意したり、そもそも戦闘にならないように根回ししたりするとかですかね。私は、王道の『敵を倒す為にキャラを強くする』で行こうと思います。
それでは『敵を倒す為にキャラを強くする』をさらに掘り下げていきます。
このあたりから大分複雑になってくるので、考えをまとめたい人はマインドマップを作ってみるといいと思います。
↓今のところこんな感じです
『敵を倒す為にキャラを強くする』をさらに掘り下げて、どうやって敵を倒すか、つまり戦闘システムを考えていきます。とりあえず5つ並べてみました。
・ターン制
・リアルタイム性
・アクション
・シューティング
・戦略シミュレーションこの時におすすめのやり方は2つあります。
1.ほかの要素を足してみる
2.よくある要素を削ってみるまずは、ほかの要素を足してみる、から説明します。
まずは、2つの戦闘システムを組み合わせてみます。
ターン制にシューティング要素を足したり、戦略シミュレーションにアクション要素を足したりと組み合わせはたくさんありますが、どの組み合わせのゲームもすでに世に出てる気がするので、これだけでは個性を出しにくいです。
そこで、戦闘システムだけでなくキャラ育成やマップ探索、シナリオ部分のシステムを組み合わせてみます。
例えば、戦闘にマップ探索の要素を組み合わせてみると、プレイヤー自身には攻撃手段はなく、マップの仕掛けを駆使して敵を倒すゲームなんてのが思いつきます。
他には、ターン制の戦闘に戦記物のシナリオを足してみるとどうなるでしょうか。戦争してる感を出すために単純にキャラを増やしていくと、プレイヤーの入力が多くなってめんどくさいゲームになりそうなので、ターン制で最小限の入力で戦争してる感を出すにはどうすればいいか…と連想していくと面白いアイディアが浮かぶかもしれません。
ただし、この要素を足してみるやり方は初心者にはあまりオススメできません。要素が増えるので制作難易度が上がってしまうからです。面白いアイディアが浮かんだら具体的な実装方法を考えて実現可能かをよく吟味しましょう。次に、よくある要素を削ってみる、を説明します。こちらはシンプルなシステムになりやすいのでオススメです。
例えばRPGによくあるレベル上げを削ってみましょう。私は、レベル上げがなく戦闘回数が固定のフリーゲームを遊んだことがあるんですが、シナリオがサクサク進められて、戦闘ではプレイヤースキルだけが求めらるので、レベル上げの嫌いな私には結構刺さりました。
他には、ステータスの種類を削ってみたりしましょう。RPGでよくあるステータスといえば、HP、MP、攻撃力、防御力、魔力など増やそうと思えばいくらでも増やせますが、あえてHPと攻撃力だけにしてみましょう。2つのステータスだけで奥の深い戦闘システムにするにはどうすればよいか考えていくと奇抜なアイディアが生まれるかもしれません。
他にもいろんな要素を削ってみましょう。私は、この時点で「これにしよう!」と思うアイディアが浮かばなかったので、戦闘システムはいったん保留にして他の要素を考えてみることにしました。
というわけで、今までに紹介した要領で考えていって以下のようになりました。本当はもっといろいろ考えてますし、没にしたアイディアも掘り下げてるんですが、見やすいように省略しています。
まだ紹介していない『どうやって実装するか』が出てきたので、まずそこを説明します。
『どうやって実装するか』を考える時の注意点はプログラムとそれ以外(絵や音楽など)で違います。プログラムの場合は、とにかく規模を小さくするよう心がけましょう。小規模のゲームなら全くの素人でもググればなんとかなるのであまり深く考えておく必要はありません。そして何よりプログラムは、小規模であれば素人がやってもプロがやっても速さ以外の差はほとんど出ません。
逆に規模を大きくするのはかなり難しいです。絵や音楽であれば、10人集めて役割分担をうまくやれば10倍速にできるので、人手を確保することさえできれば規模を大きくしやすいですが、プログラムはプロが10人集まっても絶対に10倍速にはできません。
どうしても、そこそこな規模のゲームを作りたい場合は、アセットストアやGitHubなどを駆使して、なるべく自分でコードを書かないようにしましょう。
すべて1から自分で作るのは勉強目的ならとてもオススメですが、掛けた時間の割にクソみたいなゲームしかできない事を覚悟しておきましょう。プログラム以外の場合では、すべての素材をどうやって、どのくらいの時間をかけて確保するのかをなるべく具体的に決めながら考えていきましょう。工数の見積もりが出来ないようなことをしようとするとまず間違いなくエターなります。素材を揃えられるあてが見つからなければ、そのアイディアは諦めて、確保できる素材で作れそうなアイディアを考えましょう。
保留にしていた戦闘システムはマップ探索のシステムとキャラクターの設定を踏まえて考えてみました。これ以上画像サイズが大きくなると見辛いので『どうやって実装するか?』は省略しています。
こういった流れで、すべてのアイディアをどうやって実装するかまで掘り下げて、採用するかどうか決めていけば完成です。
その5.一晩寝かせる
企画を練るのはめちゃくちゃ楽しいです。ですが99%くらいの企画は、いざ作り始めて具体的なビジョンが見えてくるとだんだん楽しくなくなっていきます。企画を練っている時が最高潮です。そこから先はモチベーションが下がっていく一方で、上がることはまずないです。なので、一晩寝かせて冷静になってからモチベーションが下がっていたら、それ以上上がることは無いので、諦めてその企画はぶん投げましょう。一晩と言わず一週間くらいはよく考えた方が良いです。
その6.とりあえず作ってみる
ここまで来て「作りたい!」という情熱が燃え続けていたら早速作り始めましょう。エターなるとかを恐れる必要はありません。失敗するのは決して無駄なことではありません。この世で最も無駄なことは何もしないことです。
まとめ
長々と色々書きましたが、一番大事なのは楽しむことです。あくまで参考程度にとどめて自分のやりたいようにやりましょう。
Let's enjoy ゲーム制作!次→2/22投稿予定