Devろぐ

日々の開発作業で使用する知識やスキルのための備忘録です。 また、閲覧いただいた方からフィードバックをいただくことで、更なる技術向上を目指しています。

【Unity】Spineの実装テスト①

目的

Unity上にて、Spineで作成された2Dアニメーションの再生を行う事。

 

準備するもの

・Unity 2018.3.9f1(https://unity3d.com/jp/unity/whats-new/2018.3.9

・Spine 3.7 Runtime(http://ja.esotericsoftware.com/spine-unity-download/

※Unityのインストール後、Unity2Dプロジェクトを新規作成し、

メニュー内Assets⇒ImportPackage⇒CustomPackageを選択し、

Spineの.packageファイルを選択するすると、Spineのランタイムがプロジェクトに読み込まれる。

 

Spineのサンプルデータを読み込む

以下ディレクトリ内に存在する「hero-pro_SkeletonData.asset」をヒエラルキー上にドラッグアンドドロップします。

Assets\Spine Examples\Spine Skeletons\Hero

 

f:id:sion06program:20190521165444j:plain

hero-pro_SkeletonData.asset

以下のようなコンテキストメニューが表示されるので、

「SkeltonAnimation」を選択すると、「Spine GameObject (hero-pro)」というオブジェクトがヒエラルキー上に生成されます。

 

f:id:sion06program:20190521165545j:plain

この時、シーンビューに以下のように表示されていれば正常に読み込むことができています。

f:id:sion06program:20190521165858j:plain

 

 

アニメーションの再生

Unity画面上部より、デバッグ実行し、ヒエラルキー上の「Spine GameObject (hero-pro)」を選択状態にすると、インスペクタ上に情報が表示されます。

f:id:sion06program:20190521170452p:plain

このインスペクタ上にて、「Animation Name」項目の値を切り替えると

あらかじめ設定されたアニメーションが再生されます。

 

次回はUnity上のスクリプトにてSpineの制御をしていきたいと思います。

【C#】Form デザイナー表示時の処理を回避する。

デザイナーについて

VisualStudio上でFormアプリケーションを開発する際、

「デザイナー」という物を多用すると思う。

これは、フォームクラスを作成した際、「.Designer.cs」という拡張子のファイルが自動生成され、そこにUIの初期化処理が自動でコーディングされる。

そのUIをグラフィカルに表示し、編集するための物が「デザイナー」と呼ばれる画面だ。

問題点

一見便利な「デザイナー」だが、若干癖がある。

例えば下記のような処理にてデザイナーが表示できない不具合があったとする。

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }

   private void Form1_Load(object sender, EventArgs e)
        {
            /*                        */
            /*  不具合の原因となる処理  */
            /*                        */
        }
}

フォームクラスのLoadイベント内の処理をデザイナー表示時のみ処理をさせたくない場合、下記のように「DesignMode」プロパティを参照すると、デザイナー表示時かそうでないかを判断できる。

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }

   private void Form1_Load(object sender, EventArgs e)
        {
            //デザイナーを開く場合は処理を抜ける。
           if (true == DesignMode) return;
            /*                         */
            /*  不具合の原因となる処理  */
            /*                         */
        }
}

【C#】オブジェクト初期化子

今回はオブジェクトの宣言文に関する「初期化子」という機能を挙げる。
クラス等のメンバーを初期化する際、通常はコンストラクタ内での初期化または、
呼出側にてインスタンス化後に個別に初期化を行う方法が一般的である。

「初期化子」

例えば、オブジェクトの初期化を以下の「_Init()」内にて行うとする。

class ClassA
{
    public int Index;
    public string Name;
    public string Country;
    
    public ClassA()
    {
        Index = -1;
        Name = string.Empty;
        Country = string.Empty;
    }
}

private void _Init()
{
    ClassA person = new ClassA();
    person.Index = 1;
    person.Name = "tarou";
    person.Country = "japan";
}

このように記述し、オブジェクトの変数宣言~コンストラクタの呼出~インスタンス化~初期化処理
という流れが一般的な方法だと思う。
しかしこの場合、コンストラクタにて既定の初期化を行い、更に呼出側で初期化を行う事になる。
これを、「初期化子」を使い記述すると以下のようになる。

class ClassA
{
    public int Index;
    public string Name;
    public string Country;
    
    public ClassA()
    {
        Index = -1;
        Name = string.Empty;
        Country = string.Empty;
    }
}

private void _Init()
{
    ClassA person = new ClassA
    {
        Index = 1,
        Name = "tarou",
        Country = "japan"
    };
}

記述から見て取れると思うが、上記だと既定のコンストラクタの呼出を行わない。
その代わりに、{ }内の処理を実行するという物。

まとめ

私自身、呼出側でオブジェクトのインスタンス化をした後に1行1行初期化処理を記述していたり、
使いまわすものになると、異なる引数のコンストラクタを複数記述していたが、
「初期化子」を利用することで、初期化のステートメントが明示的にもなり、呼出側で初期化処理を自由に変更できるメリットがある。