ゆいブロ

自分の好きなことや知見をまとめていくブログです。

スポンサーリンク

【Unity】TimelineをScriptから扱うときのTips

はじめに

TimelineをScript制御する上で必要となるメソッドを紹介します。

なお、コード中に出てくるGetPlayableDirector()は、PlayableDirectorを取得するメソッドですので各自実装するか置き換えてください。

トラック名で検索したトラックにオブジェクトをバインドさせる

/// <summary>
/// オブジェクトをタイムラインのトラックにバインドさせる
/// </summary>
///
/// <param name="trackName"> トラック名 </param>
/// <param name="sourceComponent"> 紐づけたいオブジェクト </param>
public void BindTrack( string trackName, UnityEngine.Object sourceObject)
{
    foreach( PlayableBinding bind in GetPlayableDirector().playableAsset.outputs )
    {
        if( bind.streamName == trackName )
        {
            GetPlayableDirector().SetGenericBinding( bind.sourceObject, sourceObject );
            break;
        }
    }
}

特定の型をバインドタイプとしてもつトラックにオブジェクトをバインドさせる

/// <summary>
/// T型のバインドタイプを持ったトラックにT型のオブジェクトの参照を渡す
/// </summary>
///
/// <param name="bindObject"> バインドするオブジェクト </param>
public void BindObject<T>( T bindObject ) where T : UnityEngine.Object
{
    foreach( TrackAsset trackAsset in ( GetPlayableDirector().playableAsset as TimelineAsset ).GetOutputTracks() )
    {
        foreach( PlayableBinding binding in trackAsset.outputs )
        {
            if( binding.outputTargetType == typeof( T ) )
            {
                GetPlayableDirector().SetGenericBinding( binding.sourceObject, bindObject );
            }
        }
    }
}

指定トラックのクリップを取得する


/// <summary>
/// タイムラインクリップの取得
/// </summary>
///
/// <param name="trackName"> トラック名 </param>
/// <param name="clipName"> クリップ名 </param>
///
/// <returns>
/// タイムラインクリップ
/// </returns>
public TimelineClip FindTimelineClip( string trackName, string clipName )
{
    TimelineAsset timelineAsset = GetPlayableDirector().playableAsset as TimelineAsset;
    
    if( timelineAsset != null )
    {
        // トラックからクリップリストの取得
        IEnumerable<TrackAsset> tracks = timelineAsset.GetOutputTracks();
        
                 foreach( TrackAsset track in tracks )
        {
            if( string.IsNullOrEmpty( trackName ) == false && track.name != trackName )
            {
                continue;
            }
            foreach( TimelineClip timelineClip in track.GetClips() )
            {
                if( timelineClip.displayName == clipName )
                {
                    return timelineClip;
                }
            }
        }
    }

    return null;
}

指定トラックのクリップを全取得する

/// <summary>
/// タイムラインクリップの全取得
/// </summary>
///
/// <param name="trackName"> トラック名 </param>
///
/// <returns>
/// タイムラインクリップリスト
/// </returns>
public List<TimelineClip> FindTimelineClipList( string trackName )
{
    // タイムラインアセットに変換
    TimelineAsset timelineAsset = GetPlayableDirector().playableAsset as TimelineAsset;

    if( timelineAsset != null )
    {
        // トラックからクリップリストの取得
        IEnumerable<TrackAsset> tracks = timelineAsset.GetOutputTracks();

        TrackAsset track = tracks.FirstOrDefault( e => e.name == trackName );

        IEnumerable<TimelineClip> clips = track.GetClips();

        List<TimelineClip> result = clips.ToList();

        return result;
    }
    else
    {
        return null;
    }
}

Virtual Cameraの取得

/// <summary>
/// ヴァーチャルカメラを検索してリストに追加する
/// </summary>
private List<CinemachineVirtualCamera> FindVirtualCameras()
{
    List<CinemachineVirtualCamera> timelineVirtualCameras = new List<CinemachineVirtualCamera>();
    
    foreach( TrackAsset trackAsset in ( GetPlayableDirector().playableAsset as TimelineAsset ).GetOutputTracks() )
    {
        if( trackAsset is CinemachineTrack )
        {
            foreach( TimelineClip timelineClip in trackAsset.GetClips() )
            {
                CinemachineShot cinemachineShot = null;
                cinemachineShot = timelineClip.asset as CinemachineShot;

                if( cinemachineShot != null )
                {
                    bool result;
                    CinemachineVirtualCamera cinemachineVirtualCamera = GetPlayableDirector().GetReferenceValue( cinemachineShot.VirtualCamera.exposedName, out result ) as CinemachineVirtualCamera;

                    if( result )
                    {
                        timelineVirtualCameras.Add( cinemachineVirtualCamera );
                    }
                }
            }
        }
    }

    return timelineVirtualCameras;
}

【Unity】UnityでSpriteAtlasの差分が出る問題が解決した

はじめに

11月末くらいから、Unityで共同開発している際に、変更していないSpriteAtlasの差分が出続けてしまうという問題が出ました。

Unityの特定のバージョン以降で起きており、Unity2019だけでなく2020,2018でも起きており、自分も以前に記事を書いておりました。

www.yui-tech-blog.com

今回、この問題が修正されたので記事にしようと思います。

修正されたバージョンについて

下記のバージョンで修正されるみたいです。

  • 2020.1 => 2020.1.0a19
  • 2019.3 => 2019.3.0f5
  • 2019.2 => 2019.2.19f1
  • 2018.4 => 2018.4.16f1

実際に自分もUnity2019.2.19f1を試したところ、差分が出なくなりました。 というかstoredHash、という項目自体が削除されていました。

そもそもこの現象が起きてから、変更を無視してプレイしたりビルドしても何も問題が起きていなかったので、storedHashという項目自体が不要だったのかもしれません。修正に時間がかかったのは、この項目を内部で参照しているところを片っ端から切り離すのに工数がかかったのかなと思っています。

現在、Unity2018.4.16f1以外はリリースされているので、この問題が発生している方はアップデートしてみることをおすすめします。マイナーアップデートなので基本的にはアップグレードによる不具合はないと思いますので。

最後に

Unity2018はLTS(Long Term Support)になっているのに、いまだに修正バージョンがリリースされていませんが、LTSは優先的に修正されるという勝手なイメージがあったのでちょっと残念ですね…。 確かに現バージョンやアルファ版を積極的に開発しているためそちらを優先的にする気持ちはわかりますが、安定性を求めてLTSにしたのに後回しにされるなら、あまり意味ないじゃんと個人的には思ってしまいました。 2018を使用している方はアップデートが来るまで待つか、参考リンクのフォーラム上で紹介されている暫定対応策を試してみてください。

参考リンク

https://forum.unity.com/threads/spriteatlases-keep-changing-their-hash-without-sprites-changing-polluting-source-control.754739/

【Unity】新規限定Asset Storeの10%オフクーポンコードと、おすすめAssetの紹介!

新規限定クーポンコード

Asset Storeで使用できる10%オフクーポンのクーポンコードが届きました。

届いたメールにnew costomersと記載されていたので、アセットストアで新規にアセットを購入する人が対象のキャンペーンコードみたいです。 自分は以前に購入したことがあるため、クーポンコードを入力しても適用されませんでした。

assetstore.unity.com

10%オフになるキャンペーンコードは 10OFF2020 です。 期間は1月31日の23時59分まで(米国標準時)ですのでお早めに使用してください!

ついでと言っては何ですが、評判が高いアセットや、おすすめのアセットを紹介しようと思います。

おすすめアセット紹介

Playmaker

言わずと知れたビジュアルスクリプティングを可能にするツールです。 簡単に言うと、用意されているイベントをつなげていくことで、コードを書かずに実際の処理を実装することができるツールです。

例えば、キャラクターが指定の場所でボタンを押したらドアが開いて敵が出てくる、と言った処理をなるべくコードを書かずに実装することができます。

また、イベントは自作することができるため、キャラクターの各種行動をイベント化して、イベントをつなぎ合わせてCPUの行動を作ったり…と言ったこともできます!

↓これはキャラクターの走りのイベントをつなぎ合わせて作成した図です f:id:yui-frapper:20200115013223p:plain

Unity公式でPlaymakerによる説明スライドもアップされているので参考にすると良いと思います!

www.slideshare.net

Arbor3

Playmakerと同じビジュアルスクリプティングツールです。

こちらは作者が日本人なので日本語によるサポートが受けられるのがメリットです。また、イベントの項目の表示部分が、UnityのInspectorと同じような見た目なのでとっつきやすいかもしれません。

f:id:yui-frapper:20200115013114p:plain

ただ、自エディターで作成したアセットデータの使いまわし方が分からなくてできなかったため、個人的にはガッツリゲームを作る場合はPlaymakerのがおすすめかな、と思っています。 (もし使い回しする方法があった場合はすみません💦)

AnyPortrait

2Dのアニメーションを作成するツールです。

これひとつでキャラクターのボーンアニメーションも作成できます。

ちなみに、現在作成中のSamuraiProject(仮)ではこのアセットを使って侍や陰陽師のアニメーションをつけています!

韓国の会社が開発しているのですが、サポートが手厚く、こちらから要望や質問を送るとしっかり対応していただけます。うちのサークルで送った要望が何度か採用されたり、処理負荷をどうしたらいいか質問したところパフォーマンス改善の手法を丁寧に教えていただけたりしました!

SRDebugger

デバッグ機能を表示できる画面を一から実装するのはめんどくさいですよね? このSRDebuggerはスタイリッシュなデバッグ画面を簡単に実装できるアセットです!

デフォルトでConsoleやProfilerなど優秀な機能がいくつか搭載されており、更に簡単に自作のデバッグ機能を実装することができます。

このアセットもうちのサークルで使用しています!値段に見合う価値はあるのでおすすめです!

Odin

こちらもかなり有名なインスペクターを便利に拡張してくれるアセット、Odinです。

このアセットをインポートするだけで、インスペクターでのリストの表示がわかりやすくなり、リストの順序入れ替えがインスペクター上で簡単に行えるようになります。

また、デフォルトでは対応していないdictionaryをインスペクターで表示したり、インスペクター上にメソッドを実行するためのボタンを簡単に実装したり、色々なことができるようになります。

値段は貼りますが、より便利に開発したい方にはおすすめのアセットです!

おわりに

今回は新規限定の10%オフクーポンと、おすすめアセットの紹介をしました。 これからも度々おすすめアセットを紹介したり、実際に使った上でのレビューをしていけたらな、と思っています。

assetstore.unity.com

【レビュー】初フルワイヤレスイヤホンとしてPowerbeats Proを購入したので良い点・悪い点をレビューしてみる

はじめに

最近、自分の周りでワイヤレスイヤホンを使用する人がかなり増えました。

職場ではAirpods Proを常に耳につけて仕事している人がいたり、

キャンプにいった時には、メンバーの大半がBeats Xを首から下げていたり、

その他にも何人かの知り合いからワイヤレスイヤホンを見せつけられました………

そうこうしているうちに、自分も欲しくなり、色々探し回った結果、Powerbeats Proを購入しました。

今回はこの製品を1週間程度使用してみて、良い点・悪い点をレビューしてみようと思います。

Powerbeats Proの良い点

装着時のデザイン

僕が、Powerbeats Proを選んだ一番の理由はずばり、この記事にあります!

e-earphone.blog

タイトルにはPowerbeats Proの記載がありませんが、この記事はAirpods Proと他のフルワイヤレスイヤホンを比較する記事です。

フルワイヤレスイヤホンって、基本的に耳につけるとちょっとカッコ悪く見えるんですよね(あくまで個人の感想です)。
Airpods Proもうどんみたいなのがちょっと出ていて微妙だったり、WF-1000XM3みたいな耳を覆うようなタイプも、デザインやロゴがダサかったりしていて、音質と見た目の両方を兼ね備えたフルワイヤレスイヤホンがなかなかありませんでした。

ですが、この記事の中で、色々なフルワイヤレスイヤホンを装着した画像をみていたところ、唯一Powerbeats Proだけは装着していてカッコいいな、と感じました。

フックがあったり、だいぶサイズが大きいので好みは分かれるとは思いますが、個人的にはこのフォルムは好きです!

iPhoneとの連携

Powerbeats Proは、Airpods Proにも搭載されているApple H1チップを採用しているため、iPhoneとの連携がスムーズです。

僕はiPhone11 Proを持っているのですが、ケースを開けたPowerbeats ProをiPhoneに近づけるだけで接続ボタンが表示され、すぐに使用することができました。

f:id:yui-frapper:20200114013146p:plain:w400

イヤホンや充電ケースのバッテリー残量も確認することができます。 f:id:yui-frapper:20200114013154p:plain:w400

実はBluetooth接続のヘッドホンも持っているのですが、ペアリングが上手くいかなかったり、接続が不安定になったりすることがあります。ですが、Powerbeats Proはそういったこともなく、快適に使用することができています。

また、WF-1000XM3を検討している時に、iPhoneとのBluetooth接続がたまに不安定になる、というレビューを見かけました。それでこちらの製品にしたのですが、結果大正解でした。やはり、Appleが販売しているだけあって(beats by dr.dreはAppleの傘下です)、Apple製品との連携はしっかりしています。

操作性

Powerbeats Proは、ロゴが書いてある部分がボタンになっており、このボタンをクリックすることで曲の再生/停止や、次/前の曲に移動することができます。また、その近くに音量ボタンもあるため、iPhoneを触らずに操作をすることができるんです!

しかもSpotifyなどのサービスでもこのボタンが使用できるので、歩いている最中のリスニングが快適になりました! 他のワイヤレスイヤホンと違い、タッチ式ではなくクリック式なので誤タッチの心配もなく使いやすいです。

バッテリー

バッテリーですが、メチャクチャもちます。フル充電で最大9時間もつそうです。 更に、ケースで充電すれば最大24時間使用することができます。

フルワイヤレスイヤホンを購入する際の不安要素として使用時間があると思いますが、Powerbeats Proは全くもって心配しなくて良いと思います。

悪い点

耳が痛くなる

個人的にはPowerbeats Proの最大の問題点だと思っています。これ以外の不満点はそこまで困ったりしていないのですが、耳が痛くなる問題はかなり困っています。

Powerbeats Pro付属のイヤーピースを交換して試しましたが、やはりプラスチックの丸い部分があたってしまい痛いです。これは他の人のレビュー記事などをみてみると個人差があるみたいですが困っています。

中にはイヤーピースを他社製のものに交換したら改善された、と書いている人もいたので後ほど試してみようと思います。

充電ケース

この充電ケース、他のフルワイヤレスイヤホンに比べてデカイのはまだ許容できるのですが、めっちゃ滑ります。というか購入した翌日に駅のホームで滑って落としてしまいました…。
白い傷みたいなのができましたが、擦ったら消えたので傷がつきにくい素材か何かなのかもしれません。が、そもそも滑る時点で持ち難いので、"充電ケース"用のケースを購入しようと思います……。

音質

音質は、悪くはないですがとても良くはないかなぁという印象があります。

購入時にイヤホンについているイヤーピースだと、スカスカな印象を受けました。 ああ、やっぱりフルワイヤレスイヤホンって音質はイマイチなのかな…と思っていましたがイヤーピースを一番大きいサイズにすると改善されました。

全体的に音に厚みが増し、重低音がしっかり聞こえてくるようになりました。が、やはり値段の割にイマイチなイメージがあります。これもイヤーピースを他社製に変えると良くなったという人が割と見かけられたので試してみようかと思います。

終わりに

今回はPowerbeats Proの良い点・悪い点をレビューしてみました。まだ一週間程度しか使用していないので、もう少し使用したら改めてレビューしてみようと思います。

また、イヤーピースを変えて不満点が改善されるかも試してみようと思います。

悪い点もつらつら書きましたが、個人的には結構満足していて、購入してよかったな、と思っていますので気になった方は視聴・購入してみてください! 家電量販店でも視聴できると思いますので一度視聴してみた方がいいかもです!

【Unity】UnityでSpriteAtlasの差分が出る問題の修正が順次適用されるらしい

はじめに

以前、SpriteAtlasの差分問題を記事にしました。

www.yui-tech-blog.com

この問題ですが、Unity ForumでUnity Technologiesの開発者が修正したよ!とコメントしていたので記事にします。

SpriteAtlasの差分問題とは

SpriteAtlasの差分問題とは、SpriteAtlasを変更していないのにもかかわらず、プレイボタンを押すと差分が出てしまう問題のことです。

複数人で共同開発しているプロジェクトで起きる問題であり、SpriteAtlasの変更をGitにプッシュした後に、他のパソコンでPullしてプレイボタンを押すと、SpriteAtlasのhash値が変わってしまいます。

また、Platformを切り替えた際にも起きていました。

公式の修正対応

このhash(storedHash)ですが、差分が出てもプレイなどに影響はなく、むしろどこでこの項目が使用されているのだろうか、と思っていたところ、公式でstoredHashの項目自体を削除する修正が入ったみたいです。

f:id:yui-frapper:20200113020531p:plain

https://forum.unity.com/threads/spriteatlases-keep-changing-their-hash-without-sprites-changing-polluting-source-control.754739/

Unity2020.1のalpha版で適用され、その後順次古いバージョンのUnityにも適用される予定みたいです。

1/10にUnity2018.4.15がリリースされましたが、リリースノートにこの修正についての記述はないみたいですね。

自分はUnity2019で起きているのですが、かれこれ1ヶ月くらい我慢しているので、早く修正が適用されたバージョンがリリースされて欲しいです…。

【Unity】Unity上でカットシーンを作成できるTimelineの機能と作成方法

今回は、Unity上でカットシーンを作ることができる、Timelineの機能を紹介しようと思います。

Timelineとは

Timelineは、Unityが公式に提供しているカットシーンを作成するための機能です。

アニメーション、エフェクトやサウンドの再生、オブジェクトのアクティブ/非アクティブなどの機能を組み合わせた演出がTimelineEditor上で簡単に作成することができます。
また、UnityのCinemachineという機能と連携しているため演出中のカメラも簡単につけることが出来ます。

さらに、コードを書けばユーザー自身で機能を拡張できるのでプロジェクトに応じて必要な機能を随時追加することができます。
頑張れば、下記のような映像もTimelineで作成することができます。 (プロジェクトデータがUnity-chan!公式サイトで配布されていて中身を見ることもできます)


unity-chan! - The Phantom Knowledge

Timelineの作成方法

Timelineは、TimelineAssetというものをGameObjectに紐づけることで動作するため、まずは空のゲームオブジェクトを作成します。

その次にUnityのメニューバーから Window>Sequencing>Timeline を選び、TimelineEditorを開きます。

そして、作成したゲームオブジェクトを選択すると

f:id:yui-frapper:20191226003310p:plain

このような表示になりますので、Createボタンを押しTimelineAssetを作成します。

そうすると、GameObjectにPlayableDirectorというコンポーネントがアタッチされ、そのコンポーネントのPlayableという項目に先ほど保存したTimelineAssetの参照が入っています。

TimelineEditorの説明

f:id:yui-frapper:20191226001002p:plain

これがTimelineEditorです。

Track

左側にあるのがTrackです。
Trackは、左上のAddボタンを押すと作成することができます。 Trackは、参照を持っているオブジェクトに対して何を行うかを定義したものです。Trackにオブジェクトの参照を持つことをバインド、と呼びます。
Trackの列には時系列に沿って複数のClipと呼ばれるものを配置して、オブジェクトを操作します。

Clip

Clipは、Trackの操作をどのタイミングで、どういったパラメータで操作するかを定義することができます。Track上で右クリックすると、そのTrackに必要なClipを作成するメニューが出てきます。

f:id:yui-frapper:20200103000041p:plain

Add 〇〇 Clipで作成するか、Add From 〇〇Clipで作成元のアセットを指定して作成することができます。

Unityが用意しているTrackの機能

Animation Track

Animation Clipの再生や、Timeline上で作成したAnimationを再生することができます。

Record機能を使うと、オブジェクトの移動や回転・スケールアニメーションを簡単につけることができます。

Activation Track

GameObjectのActive/非Activeを切り替えることができます。 Clipが開始するタイミングでGameObjectをActiveにし、Clipが終了するタイミングで非Activeにする機能です。

Activation Trackには、Post-playback stateという設定があり、TimelineAssetの再生が終了した際に、バインドされているオブジェクトに対して何を行うかを設定することができる項目です。デフォルトはLeave As Isになっています。

Active

再生が終了したらバインドされているオブジェクトをActiveにします。

InActive

再生が終了したらバインドされているオブジェクトを非Activeにします。

Revert

再生が終了したら、バインドされているオブジェクトを再生が開始する前のActive状態に戻します。

Leave As Is(デフォルト)

再生が終了した時のActive状態を保持します。

Audio Track

サウンド・BGMを再生する機能です。
設定項目にVolumeやPanがありますが、このトラック上全てのクリップに対して反映されてしまうため、Audio Trackを分割するか、Volumeに関してはClipの設定の方で対応するなどの注意が必要です。

また、Loopに関してはClipで設定できます。

Cinemachine Track

Cinemacineというカメラのカットを簡単に作成する機能を扱う機能です。Cinemachineについてはこの記事では取りあげません。

Control Track

ParticleSystem、PlayableDirector、GameObjectのActivationを制御するTrackです。
ITimeControlインターフェースを実装しているMonoBehaviourを扱う時にもこのTrackを使用します。

Playable Track

カスタムトラックを自作するときに使用します。コードを書いてカスタムトラックを自作する方法は、別の記事でまとめます。

Signal Track

Unity2019から追加された機能です。こちらも別の記事でまとめます。

TimelineのTips

Timelineのロック

Timelineは、そのままだと他のゲームオブジェクトを触ったりした際にTimeline Editorの表示が消えてしまいます。これは、デフォルトで現在選択されているオブジェクトにアタッチされているTimeline Assetを表示しているため、選択が解除されると表示も解除されてしまうためです。

これを回避するためにはEditor右上の鍵マークをクリックすると、TimelineEditorをロックすることができます。ロックといっても、オブジェクトの選択が解除されても表示が解除されないようになるだけですので積極的に使用することをお勧めいたします。

TimelineAssetをアタッチしたオブジェクトがPrefab化できない

TimelineAssetをアタッチしたゲームオブジェクトをPrefab化しようとすると、うまくいかないことがあると思います。これは、TimelineEditorのPreviewボタンを押して、Previewを解除するとPrefab化できるようになります。

Trackのグループ化

TimelineEditor上でTrackを作成しているうちに、量が多くて分かりにくくなってくると思います。そういった場合は、Track Groupという機能で複数のTrackをまとめると見やすくなります。

f:id:yui-frapper:20200102235635p:plain

AddボタンからTrack Groupを選び、まとめたいTrackを作成したTrack Groupにドラッグアンドドロップするだけです。

終わりに

Timelineの作成方法と、公式が提供している機能をざっくりと説明しました。
後日、カスタムトラックを自作するPlayable Trackと、Signal Trackについて解説記事を書こうと思います。

あけましておめでとうございます!!!

あけましておめでとうございます。

今年も少しずつブログを書いていきたいと思います!

新年の抱負

今年は挑戦の年にしていきたいと思います!

空いている時間で、今作成しているゲームだけでなく、3Dのアクションゲームの基盤を開発していきたいと思っています。現在の進捗はキャラクターのアクション部分とモーション部分の基盤作成を進めています!それらも含め、ゲームの進捗を記事にしていければと思っています!

また、Unityのコミュニティの勉強会やイベントにも積極的に参加していきたいです。社会人になって、学生のときのようなアクティブな活動ができていないなぁと思っていたので、どんどん活動していきたいです。

コミックマーケット

前回の記事で告知した通り、コミックマーケットc97に出展してきました! デジゲー博の時ほどではないですが、多くの方にゲームをプレイしてもらいました。

デジゲー博は販売よりも試遊プレイができるブースに人が集まり、コミケはゲームの販売を行っているブースに人が集まるイメージでした。そういったこともあり、次回のコミケではSamuraiProjectの体験版(PC)を販売するか検討している最中です!売れ行き次第では、Nintendo Switch版とSteam版の同時リリースなども視野に入れていけたらなぁと思っています。

f:id:yui-frapper:20200102005737j:plain

f:id:yui-frapper:20200102010610j:plain:w300

また、ゆうドラという、スマートフォン向けにリリースしているゲームのPC版も、今回は販売できませんでしたが次回は展示・販売を予定しております!

さいごに

いっぱいゲーム作ります。今年もよろしくお願いします。

コミケにSwitch向けゲームの出典をします

12/31(火) 南地区 ヨ-36aにて、「さいたまげーむす」としてサークル参加します!

f:id:yui-frapper:20191225002047j:plain

当日は、サークルで現在Nintendo Switch向けに開発を行っているハクスラRPGを展示します!

前回デジゲー博に参加した時は下記の写真のような感じで展示しました。

f:id:yui-frapper:20191225002637j:plain

今回もSwitchの実機を持って行って試遊できるようにするつもりです。

ゲームシステム

予め設定しておいた技から、毎ターンコンボを意識して複数の技を選んで実行するゲームシステムです。

f:id:yui-frapper:20191225003215p:plain

(画面は開発中で、まだバトルUIのデザイン実装が間に合っていなくて仮です💦)

最大4つ技を選んでバトルを開始すると、選んだ技を左から順に発動して攻撃していきます!

f:id:yui-frapper:20191225003417p:plain

ゲームシステムは現在模索中ですので、当日来られた際には是非プレイした感想をいただけるとありがたいです!

キャラクター

キャラクターは現在2体実装してあります。

f:id:yui-frapper:20191225010111p:plain:w300

刀で攻撃する職種

切れ味

侍独自のパラメータの一つに「切れ味」があります。

「切れ味」によって、刀で与えるダメージが大きく変わりますが

攻撃する度に「切れ味」を消費するため、適度に砥石で回復させることが重要です。

刀気

「切れ味」を消費すると「刀気」がたまります。

「刀気」は、大技の発動条件に設定されていたり、自分のパラメータを上昇させるバフ技で使用します。

陰陽師

f:id:yui-frapper:20191225010353p:plain:w300

式神を召喚して闘う職種

陰陽師は「札」を消費して術の発動や式神の召喚を行います。

「札」には赤、青、緑の色があり、色によって対応する属性が異なります。

装備画面

装備画面も、まだ実装中なのですが、このような和風のデザインで行こうかと思っています。

f:id:yui-frapper:20191225003645j:plain

最後に

12/31(火) 南地区 ヨ-36aにてお待ちしておりますので是非遊びに来てください!

今後もこのサイトでゲームの進捗状況を載せていこうと思います!

【Unity】AssetBundle化したプレハブの中でRenderTextureを持っていたらエラーが出た

はじめに

Timelineの中で、RenderTextureを使用していたところ、

Unity: Releasing render texture that is set as Camera.targetTexture! というエラーが出てしまいました。

バグが起きた環境

  • Unity2019

  • Timelineに必要なアセットをプレハブにまとめ、PlayableDirectorをアタッチし、AssetBundle化

  • 事前にRenderTextureを生成しておいて、TimelineAsset内でRenderTextureの参照を直接持っていた

  • Timelineのプレハブは使用後はPoolし、使いまわしていた

上記の環境でゲームを実行したところ、TimelineのプレハブをAssetbundle.Unloadする際に

Unity: Releasing render texture that is set as Camera.targetTexture!

エラーが出ました。

解決策

RenderTextureをScript上で動的に生成し、随時参照を渡して、

Finalizeのタイミングで動的生成したRenderTextureを解放するようにしました。

Timelineに直接持っているRenderTextureを適切なタイミングで解放し、参照にnullを入れてみたのですが、

そもそもTimelineのプレハブをInstantiateしているため、AssetBundle内のリソース元のプレハブ内では

依然として参照を持っているため、解決しなかったみたいです。

RenderTextureをScript上で扱うために下記のようなコードを書きました。

    /// <summary>
    /// RenderTextureに写すためのカメラ
    /// </summary>
    private Camera renderTextureCamera;
    
    /// <summary>
    /// RenderTextureを表示するためのRawImage
    /// </summary>
    private RawImage rawImage;
    
    /// <summary>
    /// RenderTexture
    /// </summary>
    private RenderTexture renderTexture;

    /// <summary>
    /// RenderTextureの生成
    /// </summary>
    private void CreateRenderTexture()
    {
        renderTexture = new RenderTexture(512,512,24);
        renderTextureCamera.targetTexture = renderTexture;
        rawImage.texture = renderTexture;
    }

    /// <summary>
    /// RenderTextureを解放
    /// </summary>
    private void ReleaseRenderTexture()
    {
        renderTextureCamera.targetTexture = null;
        rawImage.texture = null;
        renderTexture.Release();
        renderTexture = null;
    }

解説

CreateRenderTexture()でRenderTextureのセットアップを行っています。

new RenderTexture(横幅, 縦幅, Depth)で、RenderTextureのサイズとDepthを指定しつつ生成します。

その後に、RenderTextureに画面を写すためのカメラのtargetTextureと、

その映像を表示するためのRawImageのtextureにRenderTextureの参照を代入します。

また、RenderTextureを使用しなくなった場合は、ReleaseRenderTexture()を呼びます。

RenderTextureの参照を持っている変数にnullを代入し、RenderTexture.Release()でRenderTextureを解放します。

こうすることでメモリリークしないようになり、該当のエラーも出ないようになりました。

まとめ

AssetBundleにするアセット内でRenderTextureを使用したい場合は

動的に生成した方が良さそうです。

参考リンク

techblog.kayac.com

【Git】【SourceTree】SourceTreeで急にCloneやPullなどができなくなった場合の対処法

はじめに

今回はSourceTreeを使用中に、急にCloneやPullなどのコマンドでエラーが出た時の対処法を紹介します。

対処法

SourceTreeで急にPullなどができなくなった時、詳細ログを開くと

remote: Repository not found.

というエラーが出ている場合は、

リポジトリのソースURLを下記のように設定しなおせば解決する場合が多いです。

https://ユーザー名:パスワード@github.com/〜

例)ユーザー名がTaroYoshida、パスワードがtaro1000の場合

https//:TaroYoshida:taro1000@github.com/〜

と書き直せば良いです。

リポジトリのソースURLを変更する場所

まず、SourceTree画面の右上にある設定ボタンをクリックし、

f:id:yui-frapper:20191215211457p:plain

出てきたウィンドウのリモートタブに行き、項目をクリックして編集を押し、パスを上記の通りに変更すればOKです。

f:id:yui-frapper:20191215210427p:plain