2D Experimental Preview Releaseの4が(だいぶ前に)公開されてました。
https://forum.unity3d.com/threads/2d-experimental-preview-release-4.469914/
今回はプレビューリリースの他にデモプロジェクト「RoboDash 」が付いてます。
動画には無いですが、光表現とか結構悪くないように見えます。*1
*1:いいから早く出ろ
2D Experimental Preview Releaseの4が(だいぶ前に)公開されてました。
https://forum.unity3d.com/threads/2d-experimental-preview-release-4.469914/
今回はプレビューリリースの他にデモプロジェクト「RoboDash 」が付いてます。
動画には無いですが、光表現とか結構悪くないように見えます。*1
*1:いいから早く出ろ
今回は、ボタンを押した際に音を出す方法を聞かれたので、ココにも書いておきます。音の制御というよりは「ボタンを押した時に音を出したい」という要望を叶える為の物です。
自分が小学生の頃、ボタンを押したら音が出る(あと光る!)玩具で遊んだ事を覚えています。
ボタンを押したら「ジョインジョインドゥ」みたいな音が出る剣とか、ボタンを押したら「パラリパラリラパラリパラリラ(トゥーーーーン)」みたいな音が出るベルトとか。
ゲームでも、大抵のボタンを押すときは何らかの音が出ます。今回はこの動作を、出来るだけコードなしでチャレンジしてみようと思います。
音は、概ねAudio Source、Audio Listener、Audio Clipの3つの項目から成り立ちます。Audio Sourceが音を発信し、Audio Listenerが音を聞き取ります。Audio Clipは再生する音の種類です。
ソースは発信源なので、設定によっては距離や(Listenerとの)相対速度等が表現に影響するかもしれません。
今回は音場の全く関係ない2D設定で話を進めます。
オーディオを流すAPIはAudioSource.PlayOneShotです。このAPIでAudio Clipを指定してやれば、音が再生されます。
…で、実はこのAPI、ButtonのOnClickで指定出来ます。
ButtonのOn Click(Unityのイベントシステム)では、パブリックかつ戻り値がvoidかつ引数が一つ(シリアライズ可能)なAPIはエディター上で指定する事が出来るので、AudioSourceのPlayOneShotは呼び出すことが出来ます。
その際に引数に出したい音を指定してやれば、ボタンをおした時に指定した音が出ます。
まずAudioSourceを用意します。複数の音源があっても一つのAudioSourceで良いです。SE用として使いまわします。
Buttonを用意して、OnClickの「+」を押します。
None(Object)に先程作成したAudio Sourceを登録、NoFunctionはAudioSource.PlayOneShotを設定します。
あとはNone(AudioClip)の所に再生したいAudioClipを登録すれば完了です。これでボタンを押せば音がなります。
Gifには音が出ないのでAudio Mixerで音が出てるのを確認します。
上の例だと「クリック時」に音がなります。ソレ以外のケース、例えば「マウスカーソルがボタンの上に乗った」みたいなタイミングで音を出してみます。
クリック以外のタイミングは、Event Triggerで呼び出します。
例えば「ボタンの範囲内に入ったら音が出る」の場合、Add New EventTypeでボタンをクリック後、Pointer Enterを選択、後は上でやってたようにボタンにイベントを登録するだけです。
UIを複数のシーンで跨いで作成していたり、UIをPrefab化して動的に生成してる場合、Cross Scene Reference問題*1で、単純に参照関係を構築出来ない場合があります。
で、色々と考えましたが、ScriptableObjectを経由して参照関係を構築する方法を思いつきました。Audio Manager(Scriptable Object)にAudio Sourceを登録して、ボタンのイベントで呼び出してもらう方法です。
まず、二つのスクリプトを用意します。
AudioManager は、AudioSourceをScriptableObjectに登録して、登録したAudioSourceのPlayOneShotを呼び出すScriptableObject、
MonoBehaviourEventTriggerは、AwakeとDestroyのタイミングで登録したメソッドを呼び出す汎用コンポーネントです。
まずはScriptableObjectのアセットを用意します。*2。名前は別になんでも良いですが、AudioManagerとしました。
次に、AudioSourceをAudioManagerに登録する挙動を追加します。
MonobehaviourEventTriggerのOnAwakeのタイミングに、AudioManagerを設定、AudioManager.audioSourceにAudioSourceコンポーネントを設定します。
AudioManager.audioSourceはプロパティですので、イベントに使用出来ちゃいます。
これで、Audio Sourceオブジェクトがロードされると、AudioManagerにAudio Sourceコンポーネントが自動的に登録されます。
ボタンを押した際に音が出る設定も行います。
AudioSourceは直接参照出来ないので、ButtonにはAudioManagerを登録します。
AudioManagerのPlayOneShotは、AudioSourceと同じように任意の音を登録。
これでボタンとAudioSouceが揃った時、即座に音が鳴るようになりました。
下の例では、ボタンをシーンに生成すると、ボタンとAudioSourceが繋がって、ボタンを押した際に音が出るようになってます。
もう少し複雑な動作を期待するならスクリプトを書いた方が良いでしょうが、ボタンを押して音を出す演出くらいなら、UIのレベルで運用出来たららくじゃない? という感じで作ってみました。
今回はTimelineで、RootMotionを持たないキャラクターを動かしてみました。
Unity 2017より、やっとこさTimeline(カットシーンエディタ)が追加されました。
この機能は、シーケンスベースでキャラクターにAnimationを流し込める*1という機能です。
またアニメーション間でブレンドも行ってくれるので、割と良い感じにキャラクターのアニメーションを表現出来ます。
とまぁ、ココまでは良いのですが、実はこの機能Tweenがありません。まぁ作ること自体はそれ程難しくないのですが、ソレはソレ、これはコレ。
で、キャラクターの移動をどのように制御するかと言えば
というふざけた内容。
ではRootMotoinが無いアニメーションは? Clip Root Motoinをいい感じに動かしてキャラクターの位置を調整? ハハッ、5000兆歩譲ってもそれはないでしょう。
という事で、Animationで動かします。*2
ちなみに一番下のOverride Animationが移動を制御してるっぽいです。(この振る舞いはバージョンアップで変わる可能性があります)
なお、Override Animation Trackを「作る」タイミングでHumanoidのRigがOptimized Game Objectしてなかった場合、正常に動作しないという挙動を確認しました。
「Keyframing for humanoid rig is not supported!」とエラーが出て、移動した分を巻き戻されます。
RigにGenericを使用するか、Override Animation Trackを「作る」タイミングでOptimized Game Objectを設定しとけば回避出来ます(終わったらもとに戻してもOKっぽい)
Timelineでカーブを追加出来ますが、本丸のカーブエディタと比較して使い勝手は悪いです。また、繰り返し等をする際に不便です。…なのでカーブエディタを使用します。
Convert to Clip TrackでカーブはAnimationClipに変換されます。
その状態で生成されたクリップをダブルクリックすると、何時ものカーブエディタが使えます。Timelineとも同期しているので、割と楽に編集出来ます。
なお、AnimationClipはPlayableAssetの子として生成されるので、フォルダ周りもスッキリです。名前はAnimation PlayableのAnimation Clip Nameで指定します。
Project Saveしないと反映されない点に注意です。
#Unity のTimelineで、RootMotoinの無いアニメーションでカットシーンを作る的な pic.twitter.com/Ijeq6WUBGl
— 椿 (@tsubaki_t1) 2017年6月15日
Unity2017より、TextureのWrap表現でMirrorが使用出来るようになりました。
Wrapモードを指定すると、TextureのTilingが設定されていた時に「繰り返し」表現を行ってくれます。
例えば下のように、QUADは13,9のサイズでTilingが13,9の場合、横に13、縦に9の矢印マークを表示してくれます。
また、この「繰り返し」が不要な場合、Clampに設定すれば繰り返しは行われません。その場合、一つだけ表示されます。
2017よりWrapモードでMirrorが表現出来るようになりました。これは下のように、繰り返す際に反転という動画です。
上手く使用すると、地形のリピートのようなケースで、終点と始点の画像がキッチリ合うように設定する…といった面倒臭さを回避出来ます。
これが特に活用されるのはUVスクロール時でしょう。勿論、画像が反転してしまう点は注意が必要ですが、良い言い方をすれば、2回に1回は反転した画像が流れるため、UVスクロール時に2種類の画像を使用していると言えなくもないです。
多分この機能で性能面で活用出来るのはパーティクルかもしれません。
パーティクルで「円」や「左右対称」な絵を使用する事は多いと思います。この際に、片面もしくは1/4面のテクスチャを用意すれば、ミラーする事で残りの面も表示する事が期待出来ます。
例えば魔法陣のような左右対称の円形の物を使用する場合、同一サイズでより高画質な、もしくは同画質でより小さな物を使用できるかもしれません。
上下左右対象である点がミソです。
また、SpriteParticleには使用できなさそうです。
設定方法は、TextureのImporter設定にあるWrapModeをMirrorに設定するだけです。
Pre-axisではX軸とY軸で各々設定することが出来ます。例えばX軸はMirrorだがY軸はClampとしたい場合、この設定が活用出来ます。
残念ながら(?)ImageやSprite RendererといったUVありきの設定では使用する事は出来ませんでした。Raw ImageやQUAD(With Material)、Particle等では使用できるので、その辺りで使い分ける事になるかなと思われます。
やっと書く時間が取れた感