UIを作りやすくするアセット「DoozyUI」の紹介
DoozyUI とは
Unity のアセットストアで販売されている、UIを作りやすくするスクリプトのアセットです。 api.assetstore.unity3d.com
Unity Editor 上でサウンドの追加、アニメーションの追加を行い、Unity Editor と Script の行き来を減らすことが出来ます。
メニュー操作の階層化も行えるため、複雑なバックボタン処理を作り易いです。
エディター拡張も凝っており、分かり易い作りとなっています。
必須アセット
api.assetstore.unity3d.com アニメーション等で使用されているようです。 無料ですのでプロジェクトに追加しておきましょう。
大体の手順
- Hierarchy上で右クリック → DoozyUI → Managers → UIManager で UIManager を生成する
- Hierarchy上で右クリック → DoozyUI → UICanvas を作成(大本の管理キャンバス)
- Hierarchy上で右クリック → DoozyUI → UIElement を生成(これがメニューの1単位)
- UIElement を Inspector 上で設定する。 最初に表示するかどうか、開始と終了用のアニメーションの指定など
- 必要分のUIElement を生成する
- Tools → DoozyUI → ControlPanel を選択する
- UIElements,にカテゴリーを追加する
- Hierarchyに作成した UIElement に手順7のカテゴリーを設定していく(このカテゴリーの単位でメニューを操作する)
- 各UIElement に UIButton を作成する
- UIButton の OnClick の Navigation の SHOW に次のメニュー、HIDEに今のメニューのカテゴリーを設定する
- 実行する
ESC ボタンの取り扱い
階層化されたメニューを1つ戻す挙動を行います。 UIButton の OnClick の Navigation で次のメニューを設定する際に、Add To Navigbation HistoryをONにすると階層化され、Backボタンが動作するようになります。
特殊な「Back」ボタンについて
UIButton のカテゴリーを「Back」とすると、ESCキーを押したときの同様の動作をします。
おまけ スワイプメニューを作れる拡張アセット「UIDrawer」
画面端にあるメニューをスワイプで取り出すメニューを作る為のアセットです。 使用する場合は、UIDrawer → DoozyUI の順番でプロジェクトに追加しましょう。 api.assetstore.unity3d.com
おまけ DoozyUIのテストで作成したもの
幾つかの挙動はスクリプトで調整していますが、殆どの機能はDoozyUIで作成されています。 Backボタンの対応は大変ですが、DoozyUIを使う事でかなり楽に作成できると思いました。
Timeline から指定した関数を呼び出すアセット「Timeline Events」を紹介
アセットの概要
- Unity 公式の Timeline 機能を拡張するアセット
- Timeline にイベントを設定し、呼び出す事が出来る
- 驚きの無料アセット assetstore.unity.com
実際に使用する用途
- Timeline 演出中にAnimator のフラグを操作する
- Timeline 演出中に関係ないクラスの関数を呼び出す
使用するための前提条件
- Timeline を使ってオブジェクトを移動させる事が出来るくらいの知識
- Timeline の Bindings をスクリプトで制御できる
手順
- TimelineEvents をプロジェクトに追加する
- Timeline を作成する(Playable Director を作って再生する所まで)
- Event を発生させる track を作成
- Bindings のオブジェクトと同じ階層に、呼び出し用のクラスを用意する
(特定の何かを呼ぶタメのクッションになります) - Clip の作成
- Clip を選択し、Inspectorに表示させる
Method
をプルダウンから呼び出したい関数を選択する
※引数は1つ使えるようですが、今回は引数なしで確認しています。既に複雑であり、引数の用途を見いだせませんでした。- ゲームを動かして挙動確認
備考
- Event Clip は1フレームなどの短いフレームのみ発生するようにすると、処理落ちが発生したときにイベントが発生しない事があります。今後に期待
おまけ Bindings から null を渡す方法
初期の状態の場合、Director の Binding に null を渡すことが出来ません。
以下は無理やり null を渡す為の改造手順です。
主に空振り(対象がいない)状態で使用する事になります。
ゲームによっては必要になる状況と考えています。
- TimelineEventTrack.cs の 23行目の
if( trackTargetObject )
をコメントアウトする - TimelineEventBehaviour.cs の133行目の
throw new Exception("No target set for key " + key);
をreturn ;
_に書き換える
※TimelineEventBehaviour.cs で過去のオブジェクトへの参照を保持しているようです。改造を行った後は挙動の確認を十分に行って頂けると不具合を防げると思いマス
Timeline を調べた際に参考にさせて頂いたサイトまとめ
注意事項
- 書籍による纏まった情報を得辛いです。現在は各ブログ様にお世話になっている状態です。
- 調べている際、1年以上経過している情報は概要は正しくても詳細にズレが発生している事があります。
- 開発する際はドキュメントや定義されたクラスを見ながら考えていく事が重要だと思います。
参考にさせて頂いたサイトまとめ
Timeline の概要を理解する www.crossroad-tech.com
生成したオブジェクトをバインドする tsubakit1.hateblo.jp
座標系を理解する tsubakit1.hateblo.jp
公式のドキュメント https://docs.unity3d.com/ja/2018.3/Manual/TimelineSection.html
Timeline の終了検知 Unity - Scripting API: Playables.PlayableDirector.stopped
ワイルドアームズ ミリオンメモリーズの戦いの始まりの仕様について
ゲーム概要
公式サイト wild-arms.com
IP物であり、原作好きなら楽しめると思います。
少なくとも私はシナリオを楽しく読み進めております。
今回のイベント内容
- ブーメラン+ルシエドとの闘技場
- 主に1(F)のシナリオを軸にしている
- ダブル・ブーメラン・ダイナミック!
各ランキングの参加者数
- 何かの基準で振り分けされたグループでランキングを競う
- 1000位までボーナスがあるが、恐らく参加者数は100名前後と思われる
根拠は明らかに強いフレンドがいない、ランキングの変動が少なすぎる
スコアの判定
- 与えたダメージ量‐被ダメ量+クリアタイム=総スコア
好スコアの為の、敵のHP回復を待ちスコアを伸ばせる事について
- ルシエドにダメージを与えるとブーメランが回復を行う行為を発生させ、与えるダメージ量を増やす行為
- 回復するまで待つ必要があり、1プレイの時間が間延びする
- プレイ時間が延びる為、操作ミスによるユーザーへのストレスの上昇
ARMの使用に長押しを必要とするため、誤動作が辛い - 正直、忍耐力勝負にしている
- 何となく、仕様の穴だと思われる
- この要素によりランキングのカンストが発生する可能性がある
- 10分プレイし6,000,000の報告があったと思う。うろ覚えだが調べなおす気もない。
ランキングの気になる所
- 2週間の長期期間である事
- スコアを伸ばす方法がHP回復させる事のみである事
クリアタイムボーナスより大きく増やし続ける事が可能なため - ガチャによる強化要素があまり必要ない事
- ランキング内の人数が少ない事もあり、上位がとり易そうに見える為、時間だけが浪費される事につながる
これはゲームへのマンネリ感の上昇を促し、ゲームの衰退速度を加速度的に上昇させる行為であると考えている
どうすれば良くなりそうか考えてみた
- ランキングを1週間か数日のより短期間に絞る事
期間が短ければ問題が発覚した際のリスクを軽減できる
期間が短ければ集中してプレイしやすくなる(日々のプレイのアクセントとして)
期間が短ければ期間限定ガチャの限定感が増し、回しやすくなりそう - 1ランキング内の人数を増やす事
アクティブ数によるが、1000人程度は必要と感じる。BOTを混ぜても良い - ランキングの実況機能、通知を増やす事
ライブ感が薄いため、楽しくプレイできるように盛り上げて欲しい - ガチャとランキングをより関連付ける事
ボスの弱点を付けないARMガチャは、欲求値が上がり辛い
※セシリアガチャは、このタイミングで投下した方がよかったと感じます
ギアガチャが耐久力しか増えない、触っていて変化を感じない部分であるため、攻撃かアクションに変化を促すものであるべき - 2週間の場合、ランキングの前後半に分けるか、タイムアタックランキングなど別ランキングを追加する
最後に
Derkest Dungeon のMODの日本語化の流れ
はじめに
Derkest Dungeon(R)のMODの日本語化についてまとめました。
読み進める事で英語のMODを自分の手で日本語化する事が出来ます。
日本語化されたMODがもっと増えると嬉しいな(^ω^)ノ
MODをより深く知りたい場合は公式のModding Guide を参照ください。
https://steamcommunity.com/sharedfiles/filedetails/?id=819597757
日本語WikiのMod製作ページは以下を参照ください。
game-data-base.com
フォルダのパスについて
Derkest Dungeon のインストールパス
Steam\steamapps\common\DarkestDungeon\
※Steamのインストールしてあるフォルダからのパスになります。
Steamのデフォルトのインストールパスは C:\Program Files (x86)\Steam だと思います。
Steam のWorkShop からダウンロードしたMODのパス
Steam\steamapps\workshop\content\262060\(MODのID番号)\
※調べたいMODのウェブページを開き、アドレスからIDを探して下さい。
MODを書き換える準備
テキストエディタを入手する
編集するのが大変になりますのでテキストエディタを使用しましょう。
私は visual studio community 2017 を使用しています。
visual studio Community 2017visualstudio.microsoft.com
Sakura Editorsakura-editor.github.io
Visual studio codecode.visualstudio.com
ファイルの拡張子を表示しておく
編集する上で拡張子を表示させておくと、理解が深まると思われます。
日本語化の手順
ここでは SteamWorkShop から入手したMODを翻訳していきます
SteamWorkShop で日本語化したい MOD をサブスクライブする
MODのインストールを待つ
エクスプローラー上でMODフォルダを開く
localization フォルダを開く
.xml 形式の文字が格納されたファイルを開く
大概はstring_table.xml
などの分かり易いファイル名になっています。<language id="english">
から</language>
をコピーし</language>
の下に張り付ける
※他にも言語はありますが english がデフォルトの物だと思いますので english を選択しました貼り付けたテキストの
<language id="english">
を<language id="japanese">
に書き換える<language id="japanese">
のタグの中にある<![CDATA[(英語の原文)]]>
の英語の原文を日本語に翻訳していくlocalizationフォルダ内にある
localization.exe
を実行する
※入っていない場合は、DarkestDungeonに同梱されているexeをコピーしてください。
Steam\steamapps\common\DarkestDungeon\_windows\localization.exe
japanese.loc ファイルをリネームし、
(MODのID番号)_japanese.loc
に書き換えるエクスプローラー上でMODフォルダにある
modfiles.txt
を開くlocalization/(MODのID番号)_japanese.loc 12440
を追加する
※最後の番号はテキスト内で重複してはいけないので、重複しない値に書き換えておく事ゲームを起動する
MODを適用させたいセーブデータに、MODを適用させる
ゲーム内で動作を確認する
おまけ string table.xml の構造について
XML形式で書かれており、以下のような形になっています。シンプルですね。
?xml version="1.0" encoding="UTF-8"?> <root> <language id="english"> <entry id="hero_class_name_monk"><![CDATA[Monk]]></entry> ・ ・ ・ </language> <language id="japanese"> <entry id="hero_class_name_monk"><![CDATA[モンク]]></entry> ・ ・ ・ </language> </root>
PostProcessingの適用方法(初心者向け)
ページ概要
Unity 公式の PostProcessing の適用方法を簡易にまとめます。 大体は公式のドキュメントと変わらないので、初心者向けとなります。
PostProcessing とは何ぞや?
Unity 公式が作成している、ポストエフェクト(スクリーンエフェクト)を反映させるためのアセットの事。
公式サイト、git hub、unity package manager、と3種類のドキュメントがあります。
見た感じ Unity package manager のドキュメントが正確そうでした。
Unity 公式サイトのドキュメント
https://docs.unity3d.com/ja/2018.2/Manual/PostProcessing-Stack.html
git hub のドキュメント
github.com
Unity package manager のドキュメント
Description | Package Manager UI website
環境
- Unity 2018.2.4f1
- Post-processing 2.0.12-preview
インストール方法
- Unity のメニューから Window → Package Manager を選択
- All タブから Postprocessing をインストールする
使用方法
- シーン内の main camera に PostProcessLayer と PostProcessVolume コンポーネントを追加する
- PostProcessLayer の Layer を Default に設定する
※Default Layer を設定すると警告がでます。Default layer に設定すると処理負荷が高くなります。実際に製品に適用させる場合は、ポストエフェクトを適用させるレイヤーを分けて設定しましょう - PostProcessVolume の Profile パラメータの New ボタンを押す
- PostProcessVolume の Is Global にチェックを付ける
※これでシーン全てに対してポストエフェクトを設定する事になる - PostProcessVolume の Add effect... ボタンを押し、適用させたいポストエフェクトを追加する
おまけ
エフェクト効果についての覚書。 微妙にパッケージと公式ドキュメントに食い違いがあるようなので、バージョンによっては無い項目があるかもしれません。 詳細は公式サイトのドキュメントを見ましょう('ω')ノ
- Ambient Occlusion(アンビエントオクルージョン)
シーン内の環境光がオブジェクトなどで遮られているかを計算する。オブジェクトの折り目や穴が暗くなる - Auto Exposure(オートエクスポージャー)
カメラに搭載されている自動で露出を調整する機能のシミュレート - Bloom(ブルーム)
現実の発光現象。光源の光が周囲に漏れたように見える - Chromatic Aberration(クロマティックアベレーション、色収差)
レンズのシミュレート用。光の屈折率の違いで色がズレてしまう現象 - Color Grading(カラーグレーディング)
完成した画像のカラーと輝度を変更修正する処理 - Depth of Field(デプスフィールド、被写界深度)
カメラの焦点特性をシミュレートする - Grain(グレイン)
写真のフィルムのようなグラデーションノイズを発生させる - Lens Distortion(レンズディストーション)
VRなどのレンズの歪みに対応させる処理 - Motion Blur(モーションブラー)
オブジェクトの移動が速い時に起きる、画像がボケる現象 - Screen-space reflections(スクリーンスペースリフレクション)
ディファードレンダリングのみ。塗れた床や水たまりのような反射のために使用する - Vignette(ビネット)
中心よりも周囲の方が暗くなっている
Unity の TestRunner の実行の手順(使ったことが無い人向け)
ページ概要
unity の TestRunner の実行の手順をまとめています。
対象は、テストを使ったことが無くテストを触ってみたい人向けです。
詳細を把握したい方は公式ドキュメントを参照しましょう('ω')ノ docs.unity3d.com
Unity バージョン
unity 2018.1.0f2
Unity の TestRunner の概要
- テスト用の Attribute を付けた関数を実行する
- EditorMode と PlayMode の2種類がある
EditorMode = エディター上のみの同期テスト
PlayMode = 専用シーンを作って実行する、非同期のテスト - EditorMode と PlayMode はセットアップの手順が少し違います
EditorMode のセットアップ手順
- Unity の空プロジェクトを作成する
- Project Window 上で Editor フォルダを作成する
- 上部メニューの Window -> TestRunner をクリックして、Test Runner Window を表示させる
- Test Runner Window の EditMode をクリックしてモードをエディター用のテストに切り替える
- Project Window 上で Editor フォルダを選択
- Test Runner Window の Create Test Assembly Folder ボタンをクリック
Test 実行用のアセンブリファイルを生成する - Project Window 上で Editor フォルダに C# Script ファイルを作成する
- Visual Studio 等でテスト用のコードを記入する(コードは説明の後に記述しています)
- Test Runner Window の Run All をクリックする 動作を確認したプロジェクトのスクショ
PlayMode のセットアップ手順
- Unity の空プロジェクトを作成する
- 上部メニューの Window -> TestRunner をクリックして、Test Runner Window を表示させる
- Test Runner Window の PlayMode をクリックしてモードをエディター用のテストに切り替える
- Test Runner Window の Create Test Assembly Folder ボタンをクリック
Test 実行用のアセンブリファイルを生成する - ProjectWindow 上の 右上のメニュー?から、Enable playmode tests for all assemblies を選択
- ProjectWindow 上で Tests フォルダの下に Scripts フォルダを作成する
- Project Window 上で Tests フォルダに C# Script ファイルを作成する
- Visual Studio 等でテスト用のコードを記入する(コードは説明の後に記述しています)
- Test Runner Window の Run All をクリックする
動作を確認したプロジェクトのスクショ
注意事項
PlayMode は Tests アセンブリーのあるフォルダ以下の Script が対象となります。
違うフォルダにScript を作ってテストコードを書いた場合、UnityEngine.TestTools が未定義になります。
使用したテスト用のコード
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.TestTools; using NUnit.Framework; /// <summary> /// 動作確認用のクラス /// </summary> public class TestRunnerMain { /// <summary> /// 関数のテスト /// </summary> [Test] public void EditModeTest() { // エラーにならないので、コンソールには何も表示されない UnityEngine.Assertions.Assert.AreEqual( 0, 0, "関数のテスト" ); // コメントを外すとエラーがコンソールに出力される。 //UnityEngine.Assertions.Assert.AreEqual( 0, 1, "関数のテスト。エラー" ); } /// <summary> /// コルーチンのテスト /// </summary> /// <returns></returns> [UnityTest] public IEnumerator CoPlayModeTest() { UnityEngine.Assertions.Assert.AreEqual( 0, 0, "コルーチンのテスト" ); //UnityEngine.Assertions.Assert.AreEqual( 0, 1, "コルーチンのテスト。エラー" ); yield return null; } }