Raspberlyのブログ

Raspberlyのブログ

Unityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。そろそろブログタイトル決めたい

【アセット紹介】Feel で演出を作る【Unity】

今回はアセットの紹介をしていきます。
紹介するのはFeel
ゲームにおける演出を実装し、よりよいゲーム体験を作り出せるアセットです。

f:id:Raspberly:20210610035853p:plain

f:id:Raspberly:20210610034011p:plain

パブリッシャーはCorgi EngineTopDown EngineでおなじみのMore Mountainsさんです。

 

 

お得なセール情報

現在アセットストアでは、2021年上半期にリリースされた新作アセットのセールが開催中!終了しました

f:id:Raspberly:20210610010428p:plain

今回紹介する「Feel」もセール対象アセットです。
詳しくは上のバナーからどうぞ。

 

※この記事にはgifが多く含まれています

 

 

どんなアセット?

一言でいうと「ゲームの感触を向上させるアセット」です。

f:id:Raspberly:20210610033534g:plain

プレイヤーのアクションに合わせて、エフェクトや音が出たり画面が揺れたりオブジェクトが動いたり、
演出が発生するだけでゲームの見栄えや体験の質が大きく向上しますよね。
Feelを使うとそれらの演出が簡単に実装できます

Feelは、オンデマンドのゲーム感覚を Unity ゲームに提供するための、すぐに使用できるソリューションであり、できるだけ摩擦やセットアップを最小限に抑えます。これはモジュール式でユーザー フレンドリーで、非常に簡単に拡張できるシステムです。

演出のことをFeelではフィードバックと表現しています。

 

 

 公式Webサイトはこちら

feel.moremountains.com

 

 

 

開発環境

・Unity 2020.3.0f1

・Feel Ver2.2

 

以下のパッケージは必須ではないがFeelを最大限発揮するために必要なものです

・2D Animation ver3.2.9

・Cinemachine ver2.6.5

・PostProcessing ver3.0.3

・TextMeshPro ver2.1.6

 

 

 

 

インポートの確認

インポート

Feelは、Animation 2DCinemachinePostProcessingTextMesh Proがあると最大限の力を発揮します。
UPMからインストールしておきましょう。(Animation 2Dは一部デモでのみ使われる)

 

 

アセットインポート完了時はこんな感じです。

f:id:Raspberly:20210610013433p:plain

  • FeelDemosは、多くのデモを含むフォルダーであり、それぞれが独自のフォルダーとサブフォルダーに含まれています。これらのデモでは、Feel のさまざまな機能を紹介しています。詳細については、ドキュメントのデモ セクションをご覧ください。
  • MMFeedbacksは、アセットの主要部分です。これには、MMFeedbacks システム、すべてのフィードバック、およびデモ シーンが含まれています。MMFeedbacks を使用する場合に保持する必要がある唯一の必須フォルダーです。その中の Demos フォルダーを安全に削除できます。
  • MMTools : MMTools は、さまざまな便利なツールが詰まった素晴らしいライブラリで、アセットに含めると良いと思いました。驚きが満載です。
  • NiceVibrations : Feel にギフトとして含まれています。Nice Vibrationsは、iOS または Android ゲームに触覚フィードバックを追加するための最良の方法です。専用の Web サイトで詳細を確認できます。

 

デモシーンの確認

デモシーンはAssets/Feel/FeelDemosにあります。
(URPとHDRPでデモを開く場合、一部レンダリングがおかしくなることがあるそうです)

f:id:Raspberly:20210610013457p:plain

様々なゲームを想定したデモシーンが用意されていて、演出の参考になりますね。
フィードバックの具体的な設定方法も参照できます。 

f:id:Raspberly:20210610015839g:plain

f:id:Raspberly:20210610020226g:plain

f:id:Raspberly:20210610020332g:plain

エフェクトなど素材も豊富なのでいろいろ活用できそうです。

 

 

フィードバックの確認

Assets/Feel/MMFeedbacks/Demos/MMFeedbacksDemoにフィードバックの動作確認が行えるシーンがあります。

f:id:Raspberly:20210610015310p:plain



 

 

 

 

実際に試してみる

チュートリアルに従ってこの「Cubeがぴょんぴょんジャンプするシーン」にFeelで演出をつけていきます。

f:id:Raspberly:20210610023431g:plain

※細かいセッティングは割愛します

ステージとプレイヤーの作成

ステージとしてPlaneを配置します。

f:id:Raspberly:20210610021057p:plain

プレイヤーとしてCubeを配置します。
CubeにはRigidbodyと以下のFeelPlayerコンポーネントをアタッチします。

using UnityEngine;
using MoreMountains.Feedbacks;

public class FeelPlayer : MonoBehaviour
{
    public KeyCode actionKey = KeyCode.Space;
    public float jumpForce = 8f;
    public MMFeedbacks jumpFeedback;
    public MMFeedbacks landingFeedback;

    private Rigidbody rb;
    private bool isJump;

    void Start()
    {
        rb = gameObject.GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (Input.GetKeyDown(actionKey) && !isJump)
        {
            Jump();
        }
    }

    private void Jump()
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        isJump = true;
        jumpFeedback?.PlayFeedbacks();
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (!isJump) return;
        isJump = false;
        landingFeedback?.PlayFeedbacks();
    }
}

フィードバックが設定されている場合PlayFeedbacksで再生します。

 

さらにSkyboxを適用なものに変えておきます。Feel付属のSkyboxがいくつかあるのでオススメです。

ゲームを再生してスペースキーを押すとCubeがぴょんぴょんジャンプします。

f:id:Raspberly:20210610023431g:plain

まだ何もフィードバックがないので演出はありません。

 

 

Cameraの設定

CinemachineとPostProcessingの設定をします。

Cinemachine

Cinemachine/Create Virtual CameraでVirtual Cameraを作成します。

f:id:Raspberly:20210610021621p:plain

PostProcessing

3D Object/Post-process VolumeでPost-process Volumeを作成します。

f:id:Raspberly:20210610021647p:plain


isGlobalにチェックを入れ新しいプロファイルを作成、Vignetteなどいくつかエフェクトを追加します。

f:id:Raspberly:20210610021923p:plain

 

Main CameraオブジェクトにPost-process Layerコンポーネントをアタッチし、
LayerをEverytingにします。

f:id:Raspberly:20210610022102p:plain

 

フィードバックの作成

ここからがメインです。
このCubeにフィードバックを追加し演出をつけていきます。

 

Cubeの子オブジェクトとして空のGameObjectを2つ作成し
名前を「JumpFeedback」と「LandingFeedback」にMMFeedbacksコンポーネントをアタッチします。
それぞれジャンプした時・着地した時に呼ばれるフィードバックです。

f:id:Raspberly:20210610022224p:plain

作成したフィードバックはCubeのFeelPlayerコンポーネントに紐づけます。

f:id:Raspberly:20210610022243p:plain

 

フィードバックの追加

最初はシンプルにジャンプした時Cubeを回転させてみます。
JumpFeedbackオブジェクトのMMFeedbackコンポーネントを編集します。
MMFeedbacksのAdd new feedback...からTransform/Rotationを選択。

f:id:Raspberly:20210610022316p:plain

 

Rotation Targetに親のCubeを指定して、Animate Rotation Durationを1に
AnimateをXだけにしCurveを変更します。

f:id:Raspberly:20210610022701p:plain

 

この状態でゲームを再生しジャンプさせるとクルクル回転します。

f:id:Raspberly:20210610023343g:plain

 

 

フィードバックを追加2

もっと演出を追加してみます
JumdFeedbackに続けてフィードバックを追加します

音を出す

Audio/Soundフィードバックを追加、MethodをChachedにしSfxにオーディオファイルを紐づけます。

f:id:Raspberly:20210610023321p:plain

スローモーションにする

Time/Timescale Modifierフィードバックを追加。
Initial Delayを0.5にし少し遅れてスローモーションに入るようにします。
Time Scaleを0.1、Time Scale Durationを1.2にします。

f:id:Raspberly:20210610023645p:plain

最後にJumpFeedbackオブジェクトにMMTimeManagerをアタッチして完成です。
(Timeに関するフェードバックを使うときに必須のコンポーネントです)

f:id:Raspberly:20210610023747p:plain

これでジャンプして0.5秒後に1.2秒間Timescaleが0.1になります。

f:id:Raspberly:20210610024117g:plain

 

 

 

フィードバックを追加(着地時)

次は着地時の演出を追加します
LandingFeedbackオブジェクトのMMFeedbackコンポーネントを編集します

画面をゆらす

Camera/Cinemachine Impulseフィードバックを追加。
Raw Signalの右側にある歯車ボタンからPresets/6D Shakeを選択。

f:id:Raspberly:20210610024224p:plain

一番下のVelocityを2に。

f:id:Raspberly:20210610024439p:plain

 

 

最後にCinemachineの設定を変えます。
Virtual CameraのCinemachineVirtualCameraコンポーネントのExtensionsに
Cinemachine Impulse LintenerをAddします。

f:id:Raspberly:20210610024302p:plain

 

これで画面がゆれる演出ができました

f:id:Raspberly:20210610025152g:plain

 

 

Lens Distortionをつける

PostProcess/Lens Distortionフィードバックを追加
Remap Intensity Oneを50にします

f:id:Raspberly:20210610024800p:plain


Post-process VolumeのあるオブジェクトにMMLensDistortionShakerコンポーネントをアタッチ
(Lens Distortionを使うときに必須のコンポーネントです)

f:id:Raspberly:20210610024922p:plain

 

これでカメラが歪む演出ができました

f:id:Raspberly:20210610025247g:plain

 

 

Color Gradingをつける

PostProcess/Color Gradingフィードバックを追加
Shake Durationを0.3にします

f:id:Raspberly:20210610030805p:plain


Post-process VolumeのあるオブジェクトにMMColorGradingShakerコンポーネントをアタッチ
(Color Gradingを使うときに必須のコンポーネントです)

f:id:Raspberly:20210610025454p:plain

 

これでカメラの色彩を一瞬だけ変更する演出ができました(画面の点滅に注意)

f:id:Raspberly:20210610031424g:plain

 

 

 

パーティクルを出す

Particles/Particles Playフィードバックを追加。
Bound Particle Systemに再生したいParticle Systemを紐づけます。
(パーティクルは適当に、いいのがなければFeelに付属しているやつで代用)

f:id:Raspberly:20210610030242p:plain

 

これでパーティクルが再生されます

f:id:Raspberly:20210610030849g:plain

 

 

ライトを出す

Lightフィードバックを追加。
Cubeの接地あたりにPoint Lightを作成し、Bound Lightに紐づけます。

f:id:Raspberly:20210610031206p:plain

PointLightの色を上書きされたくない場合はModify Colorのチェックを外します。

 

これでライトを一瞬灯す演出ができました

f:id:Raspberly:20210610031639g:plain

 

 

 

完成

ここまで追加したフィードバックを全て使うとこうなります。
かなり見栄えがよくなりましたね。

f:id:Raspberly:20210610032245g:plain

 

 

 

 

デバッグ方法

このアセットの便利な機能にデバッグ機能があります。
これはInspectorのMMFeedbackからPlayボタンを押すことでそのフィードバックを即座に確認できる機能です。

f:id:Raspberly:20210610032752p:plain

ジャンプする時の演出を確認したい時に毎回ジャンプする必要はないわけです。
フィードバック個別に再生もできます。

 

 

 

 

 

まとめ

今回Cubeに演出をつけてみましたが、これらの演出はFeelでなくても実装はできます。
音を鳴らすならAudioSource.PlayOneShotを、エフェクトを再生したいならParticleSystem.Playを、
何か動かしたいならTween系ライブラリをインポートしScriptに記述すればいいわけです。


Feelの利点はこれらの演出を簡単に実装でき、Scriptを変えることなくパラメータの修正ができることです
デバッグ機能やドキュメントも充実しているためオススメのアセットです。

 

現在アセットストアの人気ランキング第1位!
その汎用性の高さからめちゃくちゃ流行りそうな予感がします!

 

ちょっとの時間でこんなきれいな演出が作れちゃうのはとっても便利!

f:id:Raspberly:20210610033534g:plain

 

 

 

 

余談

通常価格44ドル、セール価格で22ドルのアセットですが、
私の場合63%OFFの16.50ドルで購入できました。

f:id:Raspberly:20210610015459p:plain

理由は不明ですがTopdown Engineを購入済みのためパブリッシャーのおまけでさらに安くなったのかも。
Corgi EngineやTopdown Engineを購入済みの方はストアページを確認してみてね!

 

 

 

追記 CorgiEngineやTopDownEngineを購入済みの方


今回紹介したFeel(厳密にはMMFeedbacksなど)ですが、
CorgiEngineやTopDownEngineに最初から含まれているアセットです。
これらのアセットを購入済みの方は、別途Feelを購入する必要はありません

 

Feelに含まれているMMFeedbacksを使ったサンプルや素材が、欲しい方は購入してもいいかもしれません。

 

詳しくはこちらの記事をご覧ください!

tat1kun.hatenablog.com

 

 

他の方の紹介記事

qiita.com

xrdnk.hateblo.jp

www.karvan1230.com

temoshiblog.com

 

 

 

 

 

 

他のアセットの紹介記事はこちら↓

raspberly.hateblo.jp

 

 

 

※本記事にはAssetStoreアフィリエイトリンクが含まれています。

他、間違っている箇所、わかりにくい所がありましたらコメントにお願いします。

【Unityネタ】空気中を漂うほこりのようなパーティクルエフェクトをつくる

今回はUnityネタをやっていきます。
Particle Systemで空気中を漂うほこりのようなパーティクルエフェクトを作っていきます。

f:id:Raspberly:20210608010627g:plain

f:id:Raspberly:20210607020307p:plain

この手のエフェクトはアセット紹介や映像を撮るとき毎回作っているので、自分用にまとめておきます。

 

数値とかいじるだけでガラリと見た目が変わるのでいろいろアレンジしてみてください。

 

実行環境

Unity 2020.3.0f1

URPでも動作確認済み

 

 

 

エフェクト作成

Particle Systemの作成

新しくParticle Systemを作成。
名前は「Ambient Particle」とかにします。(Dust Particleもよく見る名前)

f:id:Raspberly:20210607005927p:plain
 

General Parameter

基本的なパラメータの設定

Prewarm:これが有効だと最初からパーティクルが展開された状態で再生されます。
Start Lifetime:パーティクル1つ1つの寿命です。10~15までのランダムにセット。
Start Speed:再生開始時のスピードです。0.1~1までのランダムにセット。
Start Size:再生開始時のサイズです。0.1~0.4までのランダムにセット。

f:id:Raspberly:20210608005659p:plain

 

Emission

パーティクルの生成数です。多ければその分密度が上がります

Rate over Time:時間ごとの生成数です。50にします。

f:id:Raspberly:20210608013750p:plain

 

Shape

Shapeはパーティクルを放出するメッシュや方向を定義します

ShapeSphereにします。ここは適当に。

Radius:30にします。ここはステージ全体を余裕で覆うくらいの大きさに。

Randomize Direction:1にします。これでランダムな方向にパーティクルが放出されます。

f:id:Raspberly:20210608010100p:plain

f:id:Raspberly:20210608015118p:plain

 

Color over Lifetime

パーティクルが突然現れて突然消えないようにします。
最初と最後はAlphaを0にして、Location20%と80%にAlpha255を指定します。
こうすることパーティクル生成時・消滅時にフェードインフェードアウトします。

f:id:Raspberly:20210608010140p:plain

 

 

これで完成です。

f:id:Raspberly:20210608010627g:plain

 

 

 

 

メモ

・Shapeの大きさ(Radius)はステージ全体の2倍くらいの大きさがちょうどいいと思います。
屋内ステージなら全体を覆うくらいでもいいかも(なんならCubeでもいい)。

・Shapeを大きくするならEmissionの生成数もあげよう。

・Size over Lifetimeで消えるとき小さくしてもいいかも。

f:id:Raspberly:20210608013319p:plain

URPでも同じ手順で問題なく動きます

f:id:Raspberly:20210608011629g:plain

 




 

 以上です。

 他、間違っている箇所、わかりにくい所がありましたらコメントにお願いします。

【勉強会レポ】: 📣 unity1week online共有会 #5

勉強会のレポート(メモ)です。
参加したのはこちら「📣 unity1week online共有会 #5」

meetup.unity3d.jp

ハッシュタグ : #u1w共有会

f:id:Raspberly:20210530022354p:plain

 

アーカイブはこちら

www.youtube.com

 

 

 

前回はこちら

raspberly.hateblo.jp

 

 

unity1week共有会って何?

unity1weekでいろんなゲームを遊んでいると
「どういう実装をしているんだろう」「どんな人が作っているのか」など気になることがいっぱい!

それら気になることを直接聞けばいいじゃん!というのがunity1week共有会の始まりで、
みんなで学んで成長することが趣旨です。

 

unity1weekについてはこちら

Unity 1週間ゲームジャム | フリーゲーム投稿サイト unityroom

今回は10人の発表者にトークしていただきます。

 

 

LT#1 Celeste+クロノア+ペパマリ?u1wを使った試作の記録

作ったゲーム

あまがさロップ | フリーゲーム投稿サイト unityroom

2Dだけで立体的な街を表現しています。
今回はこれがどのように誕生したのかお話します

開始前に決めていたこと

開始前に評価は気にせず作ってみたいゲームの試作に使おうと決めていました。
4月ごろCelesteにハマっていて、簡単操作で手軽に遊べる奥が深いゲームを作ろうと決めていました。

さらに2Dプラットフォーム+風のクロノアのようなカメラワーク(ステージに沿ってダイナミックに動く)と、
ペーパーマリオのような2Dイラストを使った立体感を兼ね備えたゲームを作りたいと考え生まれたのが「あまがさロップ」

試作の結果

・総合ランキングに入ることができましたが改善点もたくさんありました(操作性、背景の作りこみなど)
・良作ゲームの「種」としてできたので今後いろんな要素をレベルアップしたい
・このシステムを元に続編を作っています。

まとめ

u1wはゲームを完成させることができる貴重な機会です。
初めてのこと・やってみたかったことに挑戦する
そんな1週間にしてみるのもアリなんじゃないかなと思います。

 

 

 

 

LT#2 オンラインゲームを作ったら、想像以上に評価が低かった話

今回は失敗談を話します

作ったゲーム

ふたりの勇者(オンラインカードバトル) | フリーゲーム投稿サイト unityroom

2人対戦用のオンラインカードゲームを作成しました。
しかし高い評価は得られませんでした。

評価の低さへの疑問

分析した所、3つの要素が合わさってこうなったことがわかりました。
2週間で350作品遊ぶ環境 + シンプルではないルール + オンラインゲーム

 

これらは2つまでならマッチする。

シンプルではないルール

・シンプルではないルールの成功例はあるがほぼ全てオフライン専用、もしくはオンライン対応(オフラインでも遊べる)ゲーム
・オンライン限定になるととりあえずやってみようができなくなる、ルールがシンプルでなければルールの理解度に差が生じる

オンライン限定ゲーム

・オンライン限定の成功例はいくつかあるが、これらに共通しているのはルールがシンプルで直感的に理解ができる点
・シンプルでないルールでオンライン限定の成功例はunity1weekではほとんどない
・長時間遊ぶゲームはu1wには合わない(面白さを体験する前に評価せざるを得ないため本当の評価が得られない)

まとめ

・2週間で350作品遊ぶ環境 + シンプルではないルール + オンラインゲームの3つの要素があると評価が低くなりやすい
・u1wでオンライン限定のゲームを作るならルールはシンプルに
・ルールの理解に時間を費やす必要があるゲームはu1w外でやろう

 

 

 

 

LT#3 GOOLF!のデザイン⛳️ 

今回はGOOLF!のデザインについてお話します。

作ったゲーム

GOOLF! | フリーゲーム投稿サイト unityroom

ステージのデザイン

今回はKENNEYさんという素材サイトを使用させていただきました。

www.kenney.nl

この中のAbstract Platformerというバンドルを使わせてもらいました。

www.kenney.nl

差別化する絵作り

フリー素材を使うと他の人とかぶってしまう、自分の作品らしさを残すためにどうするか

・背景を変更する
死んだ画面にしないようにパターン素材をUVスクロールさせる

・色のテイストを変更する
PostProcessのColorLookupを使用する

・ライティングを工夫する
URPの2DLightを使用してボールを明るくした

UIと演出

必要最低限の情報開示をするようシンプルにしました

・打数を表示しない
打数を気にせずプレイしてほしいから、試行回数はリザルトで表示

・クリア画面ではとにかく褒める

・操作に文字は使わない

・ボールの軌跡に賑やかしとしてパーティクルを出す

トランジションは基本カラーで統一感を出す

まとめ

GOOLF!のデザインは「フリー素材を使いながら」も「特徴付けにより差別化」し
ポップでシンプルな素材デザインを活かすために「UIも演出もシンプルにし統一感を持つ」
そんなことを目指しました

 

 

 

 

LT#4 「自分はなぜゲームを作るのか」から考えるu1wの目標設定

u1wの目標設定についてお話します。(u1wに臨むうえでの心構えなど)

作ったゲーム

NOA’s Burger Shop | フリーゲーム投稿サイト unityroom

なぜわざわざゲームを作るのか

多くのクリエイターは「(自分が今まで感じてきたような)面白いゲーム体験を自分も作りたいから」ゲームを作る。
面白いゲーム体験は人それぞれだが、それを作り出す人は想定がしやすい
→「作りたいゲーム体験」はスキルのある人が時間とお金を費やして制作したもの
ではそのようなスキルはどうやって効率的に身に着けるか

ゲーム体験を作るために必要なもの

u1wを「面白いゲーム体験を作るためのスキルや経験を積むための手段・交流の場」として捉える。
u1wという場と機械を利用して、自分の課題を認識し目標を設定して学びの最大化を図ろう

目標設定をしよう

目標は自分の目的や夢のためのマイルストーン
制作後の振り返りが効率的にできる

 


ただし、絶対に主観的な評価が可能なものにすること
他人の評価を目標にしてはいけない

さらに学びを得るために

・なるべく多くのゲームを遊ぶ(なぜ面白いのか自分なりにまとめる)
・好きなゲームの作者をフォローして観察する
・制作振り返り記事を書きましょう
 言語化することで後で振り返ることができる(オススメはNotion)

まとめ

なぜゲームを作るのかもう一度考えてみて、その目的とそのための目標を設定し、u1wというイベントを利用しよう

 

 

 

 

LT#5 『Re: Terra』の雰囲気ができるまで

作ったゲーム

Re: Terra | フリーゲーム投稿サイト unityroom

2分間で森を探索するゲームです。このゲームをどのように作ったのかお話します

ゲームを考える

先に雰囲気を決定(森と腐海+2分間+探索ゲーム)
方向性を決めたらプロットを書いてみる(ストーリー性の含みを持たせることができる)
プロットから想像できそうな要素を連想させて世界観を作る

ステージ

2D Sprite Shapeで地形を作る

baba-s.hatenablog.com

背景

テラリウムをイメージして作りました

・遠景をぼかす(ぼかすことでキャラクターにピントが合う)
・近景をぼかす(プレイヤーの手前にあることが協調される)
・パララックス(手前にあるものを早く動かし、遠くのものはゆっくり動かす)

パーティクル

・チリ・ほこり(空気中のほこり)
・ゴースト(逆光のときにあらわれる現象)
・ライト(Light 2Dを使用して木漏れ日を表現)
・洞窟(freeform Light2Dを使用して地上は明るく、洞窟内を暗くする)
 ただしキャラクターも暗くなり視認性が悪くなった→キャラクターにライトを持たせた

ポストプロセス

・Bloom
・Vignette
・Film Grain

まとめ

・簡単でもいいので設定やプロットがあるととても捗る
・パーティクルは派手なのもいいが、ほこりのようにたくさん漂うものもオススメ
・ライトはまだまだ調整のしがいがある
・ポストプロセスで仕上げる
 パラメータをいじるだけでも楽しいので試してみてください

 

 

 

 

LT#6 初めてのオンライン対戦実装

作ったゲーム

16Vanish | フリーゲーム投稿サイト unityroom

パズルゲームを作りました。
新しいことに挑戦したかったためオンライン実装にトライしてみました。

 

最初に目標を宣言

オンライン要素とテストコードを書くことを目標にしました
逃げないようにTwitterで宣言

実装してみた感想

・パズルと通信はできるだけ切り離しておくのがよい(オフラインとオンラインの切り替えも楽)
・必要なデータだけをやり取りしたほうが処理負荷も軽い

ネットワーク処理の動作確認

同じプロジェクトをgit cloneで複製し、UnityHubで別プロジェクトとして登録することで
エディタを2つ同時に起動するのが楽

参考にしたサイト

zenn.dev

まとめ

・新しいことに挑戦するのは楽しい
・最初に宣言して自分を追い込むのも良い
githubソースコードを上げてあります

github.com

 

 

 

 

LT#7 共同開発はいいぞ

作ったゲーム

深海探索 | フリーゲーム投稿サイト unityroom

 

 

めちゃくちゃ面白い発表なので動画で見てほしい

 

 

 

 

LT#8 パンケーキの作り方「うまそう」を目指して

作ったゲーム

BAKE ON TIME | フリーゲーム投稿サイト unityroom

このゲームの開発経緯と「うまそう」な表現についてお話します

今回のテーマ

最後まで遊んでもらえるゲームを自分なりの狙いに設定(作品の魅力が伝わる前にやめてられないようにしたかった)

お題が2だったので2秒でストップウォッチを止めるゲームに、
ストップウォッチと相性が良く絵が簡単に作れるパンケーキをモチーフに選びました。
→パンケーキが主役だが、うまそうな表現をどうするか

「うまそう」に見せる

Cylinderに色をつけてバターっぽいものを置くとそれっぽくはなった
→本物を観察して、「おいしそう」に見える要素を誇張する

・動き(食感は動きで表現、液体から個体へ最後はふんわりと)
・湯気(あるとおいしそうに見える)
・色(食べごろの目安になることが多い)
・音(食欲をそそる音) (動画で見るときは飯テロに注意)

結果

・「美味しそう」をたくさんいただきました
・操作性は今までで一番の評価
・絵つくり中心に高評価

今後作りたい「うまそう」な表現

・液体の表現(シロップをかけたりバターがとけるような)
・食事シーン(人が食べてるシーンがもっともうまそうを感じる表現)

 

 

 

 

LT#9 簡単なのに「それっぽい」、LCDな世界観

作ったゲーム

II-2 | フリーゲーム投稿サイト unityroom

2秒間ひたすらIIと2を連打するだけのゲームです
u1wではドット絵が上位に来ることが多いので簡略化し、たまごっちレベルの解像度にしようと決めました

製作

・コードは単純な構成にしスクリプトは1ファイルのみ
・各シーン用の荒い画像とフォントに使う画像を作成
・せっかくなので音源も自作

調整

・たまごっちっぽくするために、背景よりちょっと薄めの網目の画像を重ねることで表現
・音は1つ再生するごとに止める(たまごっちは複数の音を同時に再生できないため)

まとめ

・解像度下げて2色だけにして、音も矩形波だけにすると簡単にレトロ感が出せる
・ゲームの内容自体も簡単にするとさらにレトロ感がでる
・ドットとドットの間を少し開けるとさらにたまごっちっぽくなる

 

 

 

 

LT#10 未知の体験が出来るゲームを作りたかった

作ったゲーム

2縺、縺ョ縺サ縺 | フリーゲーム投稿サイト unityroom

謎解きゲームです。LTにネタバレが含まれているので気になる方は事前に10ほどプレイしてみてください
30分以上かかったんじゃが・・・

どんなゲームを作ったか、どういう考えで作ったのか、
どうすればそういう発想にいたったのかについてお話します

 

つくったゲーム

未知の言語を解読するゲームです
言語がわかるとともにストーリーもわかっていくゲームです

自作フォント

calligraphr.comというサイトで作成しました

www.calligraphr.com

ヒントと答え

・謎解きはとけないと楽しくない
・途中離脱を防ぐためにヒントを用意しました
・終わった後にもストーリー解説しています

なぜ未知の体験にこだわるのか

・初めてやることは楽しい
 箱庭模型やFPSを初めてやってみたらめちゃくちゃ楽しかった

 

いろいろなゲームがジャンルとして確立されているが新たなジャンルを開拓したり、
システムならルールが少し変わるだけでそれは未知の体験になる

どうやって未知をどう生み出すか

・未知の体験は既存のものの組み合わせで生まれているに過ぎない
・完全な未知なゲームは天才からしか生み出せない(少なからず人は何かしらから影響を受けている)
・日ごろから思いついたアイデアはメモしておく
・幅広い知識はあった方が良い

とはいえ妥協はした

見た目・調整・音楽。SE。操作性など、その分こだわりを強くする方向に力を入れました。
斬新さが全てではなく、他の何かに特化してたら良いと思う。

まとめ

・未知は楽しくて、未知は既存のものの組み合わせ
・いろんな経験をつんで、いろんなものを組み合わせて未知の体験を生み出していくのがいいのかなと思う
・u1wは学習や挑戦に最適なので、何かに特化してテーマを決めてやっていくのがいい

 

 

 

 

 

 

以上です。
発表者のみなさんお疲れさまでした。👏👏👏

 

何回か話題に出たLight 2Dですが過去にとと様がLTをしています。
めちゃくちゃ面白いので合わせてどうぞ。

learning.unity3d.jp

 

 

 

 

他の方の感想ブログとか

note.com

 

 

間違っている箇所、消してほしいツイートがありましたらコメントにお願いします。

【勉強会レポ】: Gotanda.unity #18

勉強会のレポート(メモ)です。
参加したのはこちら「Gotanda.unity #18」

meetup.unity3d.jp

ハッシュタグ : #gotandaunity

 

アーカイブはこちら

www.youtube.com

 

togetterまとめはこちら

togetter.com

 

 

Gotanda.unityとは

都内近郊を中心に活動を行うUnityユーザのコミュニティです
Unityに興味がある人であれば、どなたでも気軽にご参加いただけます!
(五反田発の勉強会であることから「Gotanda.unity」というネーミングになっております)

 

LT#1 (スポンサー枠) Mikito Yoshiya: 使われやすいライブラリのための「コ・ツ」〜社内Unityライブラリの思想と設計〜

今回はUnityのライブラリを作る時に気をつけたいことについてお話します

宣伝

SimpleとEasyは同じようで違う

Simpleは単純であること、Easyはすぐに使い始められること。
どっちが大事かというよりは区別することが大事。
今回はSimpleさを保つためのコツを3テーマに分けて紹介します

混ぜない・絡ませない

いろいろできるはEasyだけど複雑。
→コンセプトを明確にして責務を1つにして分けていく。
適切な名前をつけることも大事。

多くの要素・ライブラリに依存

依存は複雑なもの。UPM的に問題もある。
→依存を排除することは難しいが依存先が安定しているか厳選すること。
公式の機能や標準に依存するのはよい。

設定や手順を隠蔽しない

ライブラリが大きくなると複雑性が増してしまう。
→抽象化して拡張できるようにしておく。

提供しすぎない

不要なInterfaceは公開しない。拡張に開いて変更に対して閉じる。

超絶UXなエディター拡張

GUIは基本的には複雑なもの
GUIが必要か考えること

まとめ

ライブラリ開発ではSimple/Easyを区別することが大事
Simpleさを保つために「混ぜない・絡ませない」「設定や手順を隠蔽しない」「提供しすぎない」

 

 

 

 

LT#2 tetsu: 個人開発でも使ってみようAddressable Asset System

制作中のリズムゲーム「Liminality」でAddressable Asset Systemに移行したお話をします

Addressable Assets Systemを使うメリット

・Resourcesからの脱却
・追加ダウンロードの仕組みを簡単に整えられる
・ビルドインと追加ダウンロードのリソースを区別せずに使える

アセットのロード

リズムゲームでアセットと使うものは、ジャケット画像(.png)、音源(.acb)、譜面データ(.json)です。
これらをひとまとめにしたものをグループ化しています。
ビルドインのリソースと追加ダウンロードのリソースでAsset Groupを分けておきます。

CRI ADX2と連携

CRI ADX2のロードはダウンロード機構を自分で作る必要がありますがAddressables Assets Systemを載せると他リソースと同様に扱えます。ただし注意点はいくつかある

CIとの連携

Unity Cloud Buildを活用しています。
追加ダウンロードのリソースはUnity Cloud Buildの設定からビルドできるがビルドインリソースのビルドも都度必要になる。

Addressable Asset Systemを導入してみて

・個人開発レベルでも導入できる
・リソースの追加・更新があるプロジェクトにはすごく有効
・CRI ADX2と一緒に使える
・CIと連携するとより使いやすい

 

 

 

LT#3 yutopp: Unityで使えるglTFライブラリを作る話

glTFライブラリを作る時にやってよかったことと実装できずにちょっとはまったところについてお話します

作るモチベーション

・Unityと共存してテストやCIがしやすいライブラリが作りやすかった
・glTFの拡張とUnity・非Unityで厳密に責務を分けた設計をしたかった

成果物

github.com

ファイル形式関連部分を.NET単体のプロジェクトで作ったろ事便利だった

C#のライブラリで作らず、Unityのパッケージ構造を踏襲しつつコード自体はUnityに依存しない、
一方でdotnetコマンド単体で認識できるように作ってみました。

 

これをやるとUnity依存がない部分は.NETライブラリとして開発できます。

座標系が違う状態でskinningをimport/exportするのが難しい

UnityとglTFでは座標系が違うため軸や符号を反転させる必要がある。
glTFはskinningのinverseBindMatricesはアフィン変換行列の指定しかできない。

marupeke296.com

Translateの値はそのまま分解できるがRotationとScaleは分解できない。
→Scaleは全て1とみなすか、inverseBindMatricesが単位行列になるようにmeshに焼きこむ

まとめ

もしglTFでskinを出力した時になんかゆがんだりしてるなと思ったら行列を疑うと幸せになるかも

 

 

 

LT#4 Cova@8bitdots: Unityサウンドでできる閉所表現

実装方法の解説やサウンドのデモがあるので動画でご覧ください

 

 

まとめ

サウンドの設計を考えよう
・ルーティングやカテゴリ設定はミドルウェア関係なく必要
・AudioMixerはその設定が簡単

AudioMixerにはまだまだ機能があるのでまずは使いこなしてみましょう。
そのうえで実現できない表現が出てきたらミドルウェアに頼りましょう。
いきなりミドルウェアを導入しても前提知識がないと使いこなせない。

資料

今回のリポジトリ

github.com

 

Unityサウンド エキスパート養成講座

Unityサウンド エキスパート養成講座

  • 作者:一條 貴彰
  • 発売日: 2019/08/27
  • メディア: 単行本
 

 

 

 

 

LT#5 らかん: 初めて1WeekGameJamに参加した話

今回作ったゲーム

unityroom.com

参加した動機

Unityをもっと使いこなせるようになりたい
→やっぱ作ることが重要

テーマ設定

テーマが2なので「二重の極み」を題材にしました。
・指の部分を再現したい
・粉々に砕くアクションが欲しい
・爽快感のあるゲームにしたい

モーション作成

キワミのモーションがなかったので自作しました。
Cascadeurというソフトがよさそうなので使ってみました。

cascadeur.com

体のモーションは作りやすかった。
指のモーションはVery Animationでつけなおしました。

GameStateと動作

GameStateはUniRxのEnum型で管理。変更があった時だけ実行するように。

カメラ制御

カメラはCinemachineを使用。
オブジェクトに回り込むカメラや、手振れや振動の表現をやってもらう。

おわりに

学ぶことがすごく多かった
ゲームの面白さまで作りこむのは大変だった

 

 

 

 

LT#6 (スポンサー枠) Kenta Nagai: Addressablesで大量のリソース管理・ 困りどころと解消法

Addressable Asset Systemの運用の中身をお伝えします

開発初期の課題

開発が進むとリソースの管理が大変になる
→技術選定としてAddressablesを使用 効率化していかないとまずい

設計

柔軟性の高いシンプルなアセット設計を目指す
・依存関係を最小限にする(1bundleに他のbundleを依存させない)
命名規則をしっかり決める(発注書の記載、納品データ、マスタデータなど命名規則シートを作成)

運用開発の問題

・グループのコンフリクトが問題になった(.assetやCRI.project)

→無理やり頑張ってマージする
実際は作業ブランチでグループを分ける

 

・Addressablesのバグ

手をつけていないリソースのIDも変わり、そのファイルの再DLが入ってしまう
→グループをしっかり分けて重ならないようにする
のちに更新で解決

 

・バージョン管理の問題

アプリに内包していた(最初に外出しする予定がなかった)リソースを外出ししようとしてhash値をつけ忘れファイルの上書きが発生してしまった
→hashをつけて再アップロードで解決

 

・DLの容量を最小限に

イベントとかのリソースは再度ビルドしないようにしてユーザーにDLさせないようにした
→マスタデータはあるがリソースがなくて落ちる

チームでのすり合わせの仕組みや理解が必要
終了したイベントなどのリソース削減タイミングのすり合わせが重要

まとめ

・柔軟かつシンプルな設計に
・Addressablesは万能ではない
・仕組みやフローはエンジニア以外も共有すると運用しやすい

 

 

 

 

LT#7 KENTO: withARハッカソンに参加した話

Nreal(AR)開発TipsとLiDER*1で空間スキャン表現についてお話します

withARハッカソンとは

ARエンジニアと異業種のコラボレーションを通じて新しい領域に挑戦するハッカソンです。
参加したハッカソンは伝統工芸×AR。テーマは「贈りたくなる陶器」でした。

Nreal(AR)開発Tips

Nrealとは

Nrealとはメガネ型のMRグラス。前面のカメラを通していろんな機能が使える。
陶器を中心にエフェクトを出したかったので、平面認識機能を利用して自分で位置合わせをするようにした。

NearClipへの対応

カメラまでの距離が近いと描画されなくなる。
NearClipより少し離れた地点で衝突判定を取り、一度エフェクトを拡大させながらフェードアウトさせた後にフェードインすることで、あいだを映さないようにした。

Scaniverse

LiDER搭載の端末で動作する空間・物体のスキャンアプリ。
Unity上で実寸で使うことができるので、エフェクトのサイズ感や座標をエディター上で確認できる。

qiita.com

LiDERで空間スキャン表現

屋内外問わず周辺5m以内の物体までの速度を測定し深度を測定できる。
Scaniverseのようにリアルタイムで空間のMesh生成が可能になる。

スキャン表現を作るうえでAR Foundation Editor Remoteと呼ばれるツールを使いました。

qiita.com

参考リンク

zenn.dev

styly.cc

qiita.com

qiita.com

 

 

 

 

LT#8 ぶんぶん: VR自動テストの導入によるプロジェクトの改善と、新卒一年目の苦悩

自動テストを根付かせるまでの戦い

ノリでVRの会社に入ったがUnityがわからなかった。
会社はスタートアップなので一緒に入ったインターン以外全員中途でレベル差なんてもんじゃなかった。

 

チームのプロジェクトにテストが1個もなかった。毎回手作業のAQで確認していた。
→自動テストの環境があることを知っていたので作成開始。(作り方知らないけど)

苦労したこと

・社内に自動テストの知見がなかったため全部ひとりで調べる必要があった
VRの自動テストの前例が見つからなかった
adb touchを使ってカメラの回転方向・角度を指定できるようにした(もっといいやり方はある)

 

一か月半かけて完成したが誰も使ってくれなかった・・・
・自分以外に書ける人がおらずブラックボックス
・自動テストの知見を持つ人がいない

みんなに使ってもらうために

・ドキュメントを整備する
・自動テストについての勉強会を開いた
・Slackコマンドから気軽に実行できるようにした
・毎晩リグレッションテストを実行して有用性を知ってもらう

半年かけて根付かせることに成功

まとめ

・自動テストを導入して、レグレッションを検知して手戻りを防ぐことができ、自動テストを前提とした議論ができるようになった。
・スタートアップは手取り足取り教えてくれないので、TwitterやDiscordで質問できる人を作っておく
・何もできることがない→誰もやってないことをやることが大事
・大変だけど楽しいこともある

 

 

 

LT#9 小林拓: ネイティブアプリ作成のためのUI EditorツールとしてのUnity

 

 

 

 

 

スポンサー紹介

ワンダープラネット株式会社

エンターテインメントサービスを生業としています。五反田にオフィスがあります。
最近東証マザーズへの上場が承認されました。 

 

シンプルだけど奥深い事業をしています。グローバル展開を行う専用のスタジオがあります。
社内社外のプロダクトをローカライズしてパブリッシュしたりもしています。
エンジニア募集中なので興味のあるかたはこちらからどうぞ。

www.wantedly.com

 

株式会社キッズスター

こどもの夢中を育てますというミッションを掲げています。
主に子供向けのプロダクトを作っている会社です。

お子様向けの職業体験アプリ「ごっこランド」を作成しています。

biz.kidsstar.co.jp

 

エンジニア絶賛大募集中なのでWantedly@monryまでどうぞ

www.wantedly.com

 

 

 

クロージング

・感想ツイート/ブログをよろしくお願いします。
・スポンサートークをしてみたい企業様を募集しています。
・次回は大体7月くらいです。

 

 

 以上です。

 

間違っている箇所、消してほしいツイートがありましたらコメントにお願いします。

*1:LiDARのことだと思いますがそのまま記載します

【アセット紹介】TerraWorld - Automated Level Designer で現実の地形を元にTerrainを作る【Unity】

今回はアセットの紹介をしていきます。
紹介するのはTerraWorld - Automated Level Designer
現実の地形を元にTerrainを生成するアセットです。

f:id:Raspberly:20210520222235p:plain

 

 

 

お得なセール情報

現在アセットストアでは、レベルデザインに関係したアセットのバンドルが発売中!
今回紹介する「TerraWorld - Automated Level Designer」もバンドルに含まれています。

f:id:Raspberly:20210518024635p:plain

金額に応じてアセットが異なりますが、オススメは全てのアセットが含まれた$39.99コースです。
通常の50%OFFセールで購入するよりも遥かに安く購入できるので、
気になるアセットがある場合は買っちゃいましょう!

f:id:Raspberly:20210518025913p:plain

f:id:Raspberly:20210518025953p:plain

f:id:Raspberly:20210518030035p:plain

f:id:Raspberly:20210518030055p:plain

 

どんなアセット?

現実世界の地形データ(ESRINASAOpenStreetMap)を元にTerrainを作成するアセットです。
グラフベースのエディタで、テクスチャや植生を自動配置もできます。
現在SRP(HDRP & URP)には非対応です(開発中らしい)

f:id:Raspberly:20210525172457p:plain

TerraWorld© はESRINASAOpenStreetMap におけるリアルワールドのデータや、手続き型生成およびシーン内の 3D アセット配置のための組み込みアルゴリズムを使用することでリアルに近い環境を作成する Unity プラグインです。

Automatic Level Designer​​​ ​とは自動的に手続き型コンテンツを生成することでシーンにアセットを配置するために埋め込まれた AI と共にデータを相互に渡すグラフノードを介したワールド生成パイプラインです。

 

めちゃくちゃ多機能なためクイックスタートまでやります

 

 

 

開発環境

Unity 2020.3.0f1
TerraWorld - Automated Level Designer ver2.30.3

 

 

 

インポートの確認

セットアップ

アセットインポート直後に専用のインストーラーが立ち上がり設定などを自動で行ってくれます。

f:id:Raspberly:20210519020014p:plain

f:id:Raspberly:20210519020459p:plain

 

途中でカラースペースをLinearにするか聞かれます。
Linearにするとより見栄えがよくなるためとくに問題なければ変えておきましょう。

f:id:Raspberly:20210519020052p:plain

ここまでくればセットアップは完了です。
ACCEPTからドキュメントにアクセスできます。

f:id:Raspberly:20210519020710p:plain

 

デモシーンの確認

Assets/TerraWorld/Scenesにデモシーンがあります。
アルプスとサバンナが用意されていてシーンを開く時にデータのダウンロードが行われます。
(そこそこ時間がかかる)

f:id:Raspberly:20210524185337p:plain

 

アルプスはリアリスティックなグラフィックで、キーボードとマウスでカメラ移動ができます。

 

サバンナはローポリなグラフィックが設定されています。
サバンナでは銃を持ったプレイヤーとNPCが用意されているので、そのまま歩き回ることができます。
昼夜のデイタイムシステムがあるため時間経過で昼と夜が入れ替わるのも特徴。

f:id:Raspberly:20210525001758g:plain

 

 

 

 

クイックスタート

ドキュメントに沿って、簡単に地形を生成してみます。
今回は「高尾山」周辺の地形を生成します。

 

エディターウインドウの立ち上げ

Unityのツールバーから、Tools/TerraUnity/TerraWorldProを選択

f:id:Raspberly:20210524003624p:plain

 

アセットの操作を行う専用のウインドウが立ち上がります。

f:id:Raspberly:20210524012159p:plain

 

タブごとに機能が分かれていますが今回はAREAのみさわります。

f:id:Raspberly:20210525002918p:plain

AREA:生成するエリアを定義する
HEIGHTS:フィルタ、マスクなどノードをつないで地形を変形させる
COLORS: 地形テクスチャのカラーマップを作成する
BIOMES:植生などの環境要素を作成する
TERRAIN:プラットフォームに合わせてTerrainマテリアルのタイプと機能を定義する
VFX:昼夜システム、雲、ボリュームライト、フォグなどポストプロセスを定義する

 

それぞれグラフベースのシステムが用意されていて、ノードをつなぐことで最終的な地形を作成します。

 

 

生成する地形を決める

どの地形をベースにするかを設定します。
地図から手動で探してもいいですが、地名か緯度経度を入力することで素早く目的の地形にアクセスできます。
今回は「高尾山」の地形を生成してみます。

AREAタブのOCATIONの検索窓に「Takao」と入力し検索ボタンを押します。

f:id:Raspberly:20210525011257p:plain


「Mount Takao」を選択。

f:id:Raspberly:20210525013704p:plain

 

新しいウインドウが開かれ地図が表示されます。ここで細かい位置や生成する地形の大きさを設定できます。
SIZEが地形の大きさです。4にすると4km²の地形が生成されます。

f:id:Raspberly:20210525013809p:plain

問題なければウインドウを閉じます。

 

テンプレートを決める

次にテンプレートを決めます。
テンプレートは事前に設計されたグラフで、あらかじめ地形の高低やバイオームの設定がされています。
今回はそのままテンプレートを使いますが、これをもとに改造もできます。

f:id:Raspberly:20210525022924p:plain

 

テンプレートはタイプごとに分かれています。

f:id:Raspberly:20210525022947p:plain

 

Realisticはリアル風、Stylishはローポリ風のグラフィックです。
Miscellaneousはマインクラフトのようなボクセル風が含まれています。
今回はRealisticのFORESTを使います

 

Stylish-FOREST

f:id:Raspberly:20210525201309p:plain

 

Miscellaneous-MINECRAFT

f:id:Raspberly:20210525201954p:plain

同じ「高尾山」でもテンプレートが違うだけで印象がかなり変わりますね。

 

 

生成する

ウインドウ一番下のGenerate Worldボタンから生成します。

f:id:Raspberly:20210525230621p:plain

テンプレートにそって、地面のテクスチャ、木や草などの植生が自動的にいい感じで作られます。

f:id:Raspberly:20210525172457p:plain

 

 

Google Earthと比べてみるとこんな感じ。
数回クリックするだけでこんなにリアルなTerrainが作れちゃいました!

f:id:Raspberly:20210524201733p:plain

f:id:Raspberly:20210524201746p:plain

 

 

 

 

もっと細かくカスタマイズしたい

今回はテンプレートを使い地形を作成しましたが。
地形の細かい隆起、テクスチャ、植生は手動で設定することができます。

公式の動画チュートリアルがとても充実しているのでそちらを参照ください。

www.youtube.com

 

 

 

まとめ

・TerraWorld - Automated Level Designerを使うと現実の地形を元にTerrainを作れる
・テンプレートを使えば数回クリックするだけで本格的な地形が生成できる

 

以上です。

 

 

参考資料

TerraWorld® Tutorials - YouTube

https://terraunity.com/doc/TerraWorld_QuickGuide.pdf

 

 

 

 

他のアセットの紹介記事はこちら↓

raspberly.hateblo.jp

 

 

 

※本記事にはAssetStoreアフィリエイトリンクが含まれています。

他、間違っている箇所、わかりにくい所がありましたらコメントにお願いします。

【アセット紹介】Umbra Boundary Builder で移動範囲の境界を作る【Unity】

今回はアセットの紹介をしていきます。
紹介するのはUmbra Boundary Builder
プレイヤーとナビメッシュエージェントの境界を作成するアセットです。

f:id:Raspberly:20210518101019p:plain

 

f:id:Raspberly:20210518030623p:plain



 

お得なセール情報

現在アセットストアでは、レベルデザインに関係したアセットのバンドルが発売中!
今回紹介する「Umbra Boundary Builder」もバンドルに含まれています。

f:id:Raspberly:20210518024635p:plain

金額に応じてアセットが異なりますが、オススメは全てのアセットが含まれた$39.99コースです。
通常の50%OFFセールで購入するよりも遥かに安く購入できるので、
気になるアセットがある場合は買っちゃいましょう!

f:id:Raspberly:20210518025913p:plain

f:id:Raspberly:20210518025953p:plain

f:id:Raspberly:20210518030035p:plain

f:id:Raspberly:20210518030055p:plain

blogs.unity3d.com

 

 

 

どんなアセット?

キャラクターをCharacter ControllerやNavmeshで動かすとき、移動範囲を設定するのはやや面倒ですよね。
ステージ自体が壁や障害物で囲まれているのなら問題ありませんが、
見えない壁を設置したい場合は多くのCubeを駆使しステージを囲む必要があります。
そういう時に役に立つのがこのアセット「Umbra Boundary Builder」。
ノードを配置しそれらをつないだメッシュを作成するアセットです。 

f:id:Raspberly:20210518022445g:plain

特筆すべき機能
- Unity 5+で動作
- 数回のクリックでバウンダリになるノードをシーンに追加できます。
- ナビメッシュとそれを使用するAIが、プレイヤーと同じ境界を尊重するようにします。
- バウンダリをベイクしなくても、リアルタイムでバウンダリが作成されるのを確認できます。
- シンプル、軽量、簡単に使用可能

 

 

こちらの動画のようなキャラクターコントローラーを使う場合に便利です。

www.youtube.com

 

 

実行環境

Unity2020.1.17f1
Umbra Boundary Builder Ver2.3.2

 

 

インポートの確認

アセットインポート完了時はこんな感じです。

f:id:Raspberly:20210518015620p:plain

Generalというフォルダには、Umbra Boundary Builderに限らず同パブリッシャーのアセットで使われる共通処理や機能が含まれています。削除しないようにしましょう。
ちなみにこれらの機能はusingステートメントを追加するこで誰でも使えるようです。

 

肝心のアセットの使い方はUmbraEvolution/UmbraBoundaryBuilder/README_UmbraBoundaryBuilderに書いてあります。
デモシーンはないようです。

 

 

 

主要コンポーネント

このアセットを使いこなすうえで重要なコンポーネントを紹介します。
機械翻訳を使用しているのでおかしいところがあるかも

Boundary Builder

f:id:Raspberly:20210518001602p:plain

Use Physical Gizmos

Unityエディタにギズモに似たオブジェクトを作成します。
無効にするまでビルド後も継続されます。基本的にオンにしない方がよさそう。

フィジカルギズモは、Unityのビルトインギズモと比較して、計算量が多く、実験的な機能です。デフォルトのギズモが動作しない場合や、プレイモードや開発ビルドでギズモを使用する必要がある場合にのみ使用してください。

Gizmos Always On

選択されていなくてもシーンビュー上で常表示されるようになります。

Add New Boundary

Boundary Builderの子オブジェクトにBoundaryを作成します。

 

Boundary

f:id:Raspberly:20210518001910p:plain

Placeable Layers

シーンビューにノードを配置する時にレイキャストが反応するレイヤー。

Boundary Gizmo Colour & Node Gizmo Colour

境界線とノードのギズモの色

 

f:id:Raspberly:20210518005716p:plain

Node Gizmo Radius

ノードのギズモの大きさ

Closed Loop

最初と最後のノードの間に境界を作成するかどうか。完全に閉じた境界を作るには有効にします。

f:id:Raspberly:20210518023732g:plain

Use Box Colliders

コライダーを有効にするかどうか

Physics Layer

境界の物理レイヤー

Boundary Thickness & Height

境界の厚みと高さ

f:id:Raspberly:20210518021555g:plain

Vertical Offset

垂直方向のオフセット

Boundary Mesh Material

作成されるメッシュのマテリアル。何も設定しないとこうなる。
何も表示しなくない場合は透明なシェーダーを割り当てるなりMesh Rendererを切るなりしましょう。

 

 

 

 

実際に試してみる

シーンにBoundary Builderを配置する

Unityエディターのツールバーから、Tools/UmbraEvolution/UmbraBoundaryBuilder/Add Boundary Builder
BoundaryBuilderコンポーネントがアタッチされたゲームオブジェクトを作成します。

f:id:Raspberly:20210518001521p:plain

Boundaryの作成

Boundary BuilderのAdd New BoundaryでBundaryを作成します。

f:id:Raspberly:20210518001748p:plain

見やすいようにギズモや境界の大きさを変えておきます。

f:id:Raspberly:20210518014342p:plain

ノードの配置

BoundaryのStart Placing Nodesボタンを押します。

f:id:Raspberly:20210518020331p:plain

この状態で、シーンビュー上を左クリックしていくとその場所にノードが作成されます。
キャラクターの移動範囲を囲むように配置していきます。

f:id:Raspberly:20210518021640g:plain

ノードを配置し終わったら、BoundaryのStop Placing Nodesを押します(忘れないように)

f:id:Raspberly:20210518020718p:plain

メッシュの作成

配置したノードをつなげてメッシュを作成します。
BoundaryのGenerate Meshボタンを押します。

f:id:Raspberly:20210518020744p:plain

 

無事作成されました。
マテリアルを何も設定していないので煌びやかな色になっていますが、
BoundaryのMesh Rendererを無効化することで解決できます。
(NavMeshを使用している場合はBakeしてから無効化しましょう)

f:id:Raspberly:20210518021226p:plain

f:id:Raspberly:20210518020832p:plain

今回は見えない壁を作りましたが、目に見える壁にしたい場合はBoundaryからマテリアルを割り当てると良い

 

 

これで完成です。
プレイヤーの移動範囲が制限されていますね。

f:id:Raspberly:20210518022445g:plain

 

 

Boundaryは複数作成できるので迷路のような細かい境界も作成できます。
この場合、BoundaryのClosed Loopをオフにしておくと良いですね。

f:id:Raspberly:20210518023017p:plain

 

 

以上です。

 

 

 

他のアセットの紹介記事はこちら↓

raspberly.hateblo.jp

 

 

 

※本記事にはAssetStoreアフィリエイトリンクが含まれています。

他、間違っている箇所、わかりにくい所がありましたらコメントにお願いします。

 

【Unityネタ】アニメーションの再生開始位置をランダムにする

今回はUnityネタをやっていきます。
アニメーション再生時の開始位置をランダムにする方法について。

f:id:Raspberly:20210513040305g:plain

まとめ

animator.Play(animator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0, Random.Range(0f, 1f));

でアニメーションを再生すれば良い

 

 

はじめに

ゲームや映像作品の背景用に適当な歩行者を配置することがあると思いますが。
全員が同じタイミングでアニメーションを再生すると完全に歩調が合ってしまい、
歩行者として見た場合かなり不自然な見た目になります。意図的に合わせたいなら別ですが。

f:id:Raspberly:20210513023845g:plain

 

アニメーション再生時の開始位置をそれぞれずらすことで、複数体表示しても違和感のない絵面にできます。

f:id:Raspberly:20210513023905g:plain

 

 

 

開発環境

Unity 2020.3.0f1

 

キャラクターとアニメーションはこちらのアセットを使用しています

Low Poly Animated People

 

 

 

 

キャラクターやAnimatorの準備

一番シンプルな方法でやります。
適当なキャラクターと再生するアニメーションを用意しておきます。

キャラクター

キャラクターをシーンに配置し、Animatorコンポーネントをアタッチします。

f:id:Raspberly:20210513032435p:plain

Animator Controller

Animator Controllerを作成し、アニメーションを紐づけておきます。

f:id:Raspberly:20210513031616p:plain

作成したAnimator ControllerをキャラクターにアタッチしたAnimatorにアサインします。

f:id:Raspberly:20210513032528p:plain

アニメーション再生開始位置をランダムにするスクリプト

以下のC#スクリプトをキャラクターにアタッチします。

using UnityEngine;

public class WalkerAnimation : MonoBehaviour
{
    public Animator animator;

    void Start()
    {
        animator.Play(animator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0, Random.Range(0f, 1f));
    }
}

 

アタッチしたら、変数animatorにAnimatorをアサインします。

f:id:Raspberly:20210513033013p:plain

これで完了です。
シーンを実行してみると毎回アニメーションの開始位置がランダムに変化します。

 

 

 

スクリプトの解説

Animator.Play()はアニメーションを再生するメソッドですが、ここで重要なのは第三引数です。
ここに時間のオフセットを設定することで、アニメーションの開始位置を指定することができます。
オフセットは0~1の値で設定できます。0以外の値の場合アニメーションは途中から再生されます

 

今回は0~1までの乱数を与え、アニメーションがバラバラになるようにしています。

docs.unity3d.com

 

 

 

まとめ

animator.Play(animator.GetCurrentAnimatorStateInfo(0).shortNameHash, 0, Random.Range(0f, 1f));

でアニメーションを再生すれば良い

 

 

もっと違和感をなくしたいなら、再生速度も+-してあげるといいかも

 

 

 

参考資料

taskem — アニメーションの再生位置をスクリプトで管理する

※animator.ForceStateNormalizedTimeでのやり方は現在非推奨になっているようです。