セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

Unity パーティクルがspriteの後ろ側に描画される

タイトル通りです。まずは下の画像をみてください。
f:id:thinline196:20161218172507p:plain


これを仮に雷の魔法を放っている場面だとします。どうでしょうか?後ろの柱とカメラに挟まれている部分のパーティクルはしっかり描画されていますが、他の壁と重なった部分は完全に抜けてしまっています。亜空間に削り取られています。

解決法

 この後ろの壁は、イメージとして存在させています。なのでcanvasを通じてこの空間上にあるわけです。なので、イメージではなくcanvasのSorting Layerをいじってやれば、描画順が設定できます。(イメージのソートを変更しても変わらなかった)

canvasに付いているこちらから変更が可能です。
f:id:thinline196:20161218172952p:plain



このDefaultを自分で作成したLayerにして、SortingLayerでDefaultより前に持っていきましょう。これで、OK


結果はこのように、無事雷の魔法になりました。canvasを変更することに気がつけば、さほど問題にはならないかも笑
f:id:thinline196:20161218173144p:plain

雑談 Oculus Touch遊んできた

眠いので日記だけダラダラ書こうかな笑
本日もゲーム制作進みました。Mayaの方でも色々と日々勉強があり、違うマテリアルを読み込んでいるオブジェクトをグループ化してfbxにしてしまうと、Unityの方でMaterialが上手く取得できなかった(頑張ればできるかも?)ため、グループ化を解除してみたり、、、いや今度ネタが尽きた時用にメモ程度にとどめておこう笑


 本日、研究室の方で先輩の研究のお手伝いをしました。結構意見を聞いてくれる先輩で、向こうの方も僕のことを頼りにしてくれているらしく、非常にありがたく楽しく勉強になります。HMDに携帯端末や手を投影して、その使いやすさや違和感などそんなところを調べているのですが、LEAPMOTIONでの手の検出がやはり限界があるように感じました。HMDにLEAPを装着しているため、顔面が向いている方向から計算したLEAPの検出範囲内でしか手が出力されません。これで、VR空間内で体の横に表示された指示書を確認しようとすると、別の作業をしてた手が検出範囲から出てしまい、作業が途中で止まってしまいます。ここは、もう被験者の方にある程度の縛りを与えて実験を行うのがベストだと個人的に思いました。例えば、確認してから出ないと作業ができないとするなど。

 それが終わった後、先日研究室に届いたばかりのOculus Touchを遊ばさせてもらいました!f:id:thinline196:20161215012637j:plain

 感想はよくできたゲーム機だなぁ〜と言った感じです。手での操作感はやはり素晴らしいものがありますが、HMDからの映像が体とリンクしすぎている分、手操作での少しの違和感が目立ってしまうなと感じました。ものを掴む際も、最初は手を全て開いてしまい、コントローラを落としそうになりました笑 そのくらい、没入感は素晴らしいです。ただ、日常やっている動作と違うことをしなければいけないと思った時、やはりゲームだなという印象を持ってしまいました。(ひねくれててごめんなさい)振動などによる手へのレスポンスが受け取れなければいけない以上、コントローラを使用する以外に方法は、電極を体に繋ぐか、実際にその場に物体を出現させるぐらいしかないと思うので、日常動作を捨ててでも、手へのレスポンスは選択すべきなのかもしれませんね。日常動作を求めるなら普通に生きろってはなしです笑
 何はともあれ、Oculus Touchは素晴らしいと思うので、ぜひ機会があれば使ってみてください!

Mayaでパーツごとに別々のimageからテクスチャを作成する&マテリアルのプロパティを動的に変更

やば!どうでしょうが新作だってよ!!!!超嬉しいです笑 まぁここでは関係ないけど!

本日は相方に現在制作中のゲーム内で登場する村人(モブキャラ)の作成を依頼されました。できれば一体ずつ作って行きたいのですが、できれば時間は他のところにつぎ込みたいということで、なるべく使いまわせる村人の制作にチャレンジしました。


服の色*ズボンの色*髪の色*個体数

 これだけの変化をつけられれば文句はないでしょうということで、村人に限れば3種類のモデルを作成することにしました。後は、スクリプトからそれぞれの色を変更すれば見た目にもわかりやすいですね!目の配置なども変更できればと思ったのですが、imageとして後からモデルに手作業で貼り付けるぐらいしか思い浮かばず、またゲーム内容的に目はそれほども立つものでもなかったため、今回は諦めて肌のテクスチャと一緒に書き込んでしまうことにしました。まぁこれは必要な妥協ですよ(というか目を動かすとかまだやったことないのでそのうちに)


 で、色を変える方法としてはこちらを参考にします。
マテリアルのプロパティをスクリプトから変更【Unity】 - (:3[kanのメモ帳]


ググって一番最初に出てきてくれました。Shaderは上のサイト様をみて、プロパティ一覧にcolor系の色をいじれそうなものをチョイスしましょう。とりあえず選んだのはLegacyのself-illunimの一番上の方。skyboxが写り込んでしまうのが嫌だったので、これを選びました。


 で、実際にモデルを作成。Rig付けもしっかり行います。完成したものを、手動で色を変更してみました。

f:id:thinline196:20161214004610p:plain
f:id:thinline196:20161214005005p:plain


しっかり変更できますね!なのでおそらく動的にも変更は可能でしょう!ちなみに、デフォルトは白ベースとなっており微妙に柄も付いております。デフォルトを白とすることで、色の変化が鮮明に出るようになります。ベースが青とかだと変化はとてもわかりにくくなりと思います。靴はそんなに目立つ部分ではないですが、靴がないと全身タイツみたいになってしまうので、黒の靴としました。こうすることで、色で上書きがされずしっかり靴を認知させることができると思います。

相方にgitに載せたことをお知らせしてあげました!もしできなかったよーと返事が来た時は、その原因などをここに追記しようかなと思います。



パーツごとに別々のimageからテクスチャを作成する

Maya初心者にはこれが意外と大変でした。なので今回も自我流です。

そもそも、なぜオブジェクトごとに別のimageを用意しようとしたかと言うと、色を変更するためです。上に書いた通りに実装する場合、服の色とズボンの色などはそれぞれ別の色を指定できた方が見栄えもいいですし、パターンも増えます。(全部一色だとジャージ着てるみたいになっちゃう) ところが、パーツを一つのイメージで作成すると一箇所の色の変更が、他のパーツの色も変更してしまいます。。。(と、思っていたのですが、書いていた時に気づいたけど、Materialを別のものにさえしておけば、一つのイメージから読み込んでも他のパーツに影響しないかも。これは試してみる価値ありですね。)
 まぁなのでとりあえず今回は、最初に思いついた方法を使用しました。


 やり方ですが、単にマテリアルを新たに取り付けてやるだけです。笑 この方法を確立するだけでも大変でしたけど笑
なので次回はぜひ、一つのイメージから別々のマテリアルにテクスチャを渡してみたいと思ってます!(グダグダでごめんなさい)

さて、残り二体の村人も作らなきゃな笑 全くの専門外ですが嫌いな作業ではないです(上手くないけど!)笑
以上。

Unity 動的に別のスクリプトに所持しているメソッドを渡す〜UnityEvent

タイトル通りです。

今回は制作中のゲームの中で少し複雑なことをしようと思い、今回のことをざっと調べました。そのメモを書きます。


docs.unity3d.com


まぁここを読めば全てわかるんですが、、

例えば以下のようなクラスがあったとします。

using UnityEngine;
using System.Collections;
using UnityEngine.Events;

public class EventTest : MonoBehaviour 
{
     public UnityEvent ev;
     
    void CallAnotherMethod(){
         ev.Invoke();
    }
}

それでもって、別のクラスでこのクラスのevにメソッドをわたあしてあげます。

    bool attack=false;

----------何かの関数内---------
         EventTest eTest=GetComponent<EventTest>();
         eTest.ev.AddListener( PrintDeb);
--------------------------------
    void PrintDeb(){
        attack=true;
        Debug.Log("called");
    }

これで、attackをtrueにし、デバッグを吐く関数をev内に渡すことができました。後は最初のスクリプトのCallAnotherMethod()をどこかで読んであげれば、Invoke()によりev内に保存されていたPrintDeb()が呼ばれます。

ちなみに、引数を渡す関数を指定したいときは、EventUnityをオーバーライドしてやれば、引数を渡すことができます。以下は、リファレンスのコピーです。

using UnityEngine;
using UnityEngine.Events;

[System.Serializable]
public class MyIntEvent : UnityEvent<int>
{
}

public class ExampleClass : MonoBehaviour
{
	public MyIntEvent m_MyEvent;

	void Start ()
	{
		if (m_MyEvent == null)
			m_MyEvent = new MyIntEvent();

		m_MyEvent.AddListener (Ping);
	}

	void Update () 
	{
		if (Input.anyKeyDown && m_MyEvent != null)
		{
			m_MyEvent.Invoke (5);
		}
	}

	void Ping (int i)
	{
		Debug.Log ("Ping" + i);
	}
}


僕はこれを、後から任意のタイミングで生成されるオブジェクトが削除されるタイミングを認知するためのフラグの変化に使用しました。(わかりにくい説明)


まぁOnClickなどもこれを使用して呼ばれているらしいので、感覚的にどんなものなのかは、掴みやすいのではないでしょうか?結構小回りが効くものなので役立ちますが、たくさんのところで使用すると複雑なものになってしまうので(動的に紐づけるとバグなどでスクリプトを見返した時に見落としやすい)、用法用量をお守りください。

Unityエラー CommandInvokationFailure: Failed to re-package resources.

エラーの内容

CommandInvokationFailure: Failed to re-package resources.
C:\Users\devel\AppData\Local\Android\sdk\build-tools\23.0.3\aapt.exe package --auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S "res" -I "C:/Users/devel/AppData/Local/Android/sdk\platforms\android-25\android.jar" -F bin/resources.ap_

stderr[
AndroidManifest.xml:2: error: Error parsing XML: reference to invalid character number

]
stdout[
Configurations:
 (default)
 v14
 v21
 ldpi-v4
 hdpi-v4
 xhdpi-v4
 xxhdpi-v4
 xxxhdpi-v4

Files:
  drawable\app_icon.png
    Src: () res\drawable\app_icon.png
    Src: (ldpi-v4) res\drawable-ldpi\app_icon.png
    Src: (hdpi-v4) res\drawable-hdpi\app_icon.png
    Src: (xhdpi-v4) res\drawable-xhdpi\app_icon.png
    Src: (xxhdpi-v4) res\drawable-xxhdpi\app_icon.png
    Src: (xxxhdpi-v4) res\drawable-xxxhdpi\app_icon.png
  values\strings.xml
    Src: () res\values\strings.xml
  values\styles.xml
    Src: () res\values\styles.xml
    Src: (v14) res\values-v14\styles.xml
    Src: (v21) res\values-v21\styles.xml
  AndroidManifest.xml
    Src: () AndroidManifest.xml

Resource Dirs:
  Type drawable
    drawable\app_icon.png
      Src: () res\drawable\app_icon.png
      Src: (ldpi-v4) res\drawable-ldpi\app_icon.png
      Src: (hdpi-v4) res\drawable-hdpi\app_icon.png
      Src: (xhdpi-v4) res\drawable-xhdpi\app_icon.png
      Src: (xxhdpi-v4) res\drawable-xxhdpi\app_icon.png
      Src: (xhdpi-v4) res\drawable-xhdpi\app_icon.png
      Src: (xxhdpi-v4) res\drawable-xxhdpi\app_icon.png
      Src: (xxxhdpi-v4) res\drawable-xxxhdpi\app_icon.png
  Type values
    values\styles.xml
      Src: () res\values\styles.xml
      Src: (v14) res\values-v14\styles.xml
      Src: (v21) res\values-v21\styles.xml
]
UnityEditor.Android.Command.Run (System.Diagnostics.ProcessStartInfo psi, UnityEditor.Android.WaitingForProcessToExit waitingForProcessToExit, System.String errorMsg)
UnityEditor.Android.PostProcessor.Tasks.TasksCommon.Exec (System.String command, System.String args, System.String workingdir, System.String errorMsg, Int32 retiresOnFailure)
UnityEditor.HostView:OnGUI()

develはユーザ名です。

これが起こったのは、IOS向けにビルドしてから、再びアンドロイド向けにビルドを走らせたときでした。

原因

 AndroidManifestの二行目がおかしいということだったので、エクスプローラを開いてかくにんしました。[Temp>StagingArea]の中に、ファイルは格納されています。見たところ、android:versionNameの項目がおかしい。1.1.9を入れておいてほしかったのに、よくわからない正規表現みたいな文字がはいっていました。なので、Unity上で再びバージョンを入力しなおしたところ、エラーは出ずにビルド完了!

考察

 考察なんてたいしたものではないですが、IOSAndroidでバージョンのずれがあり、修正しなおした時に何かしらのミスがあったのではないかとおもいます。みなさんはぜひ統一しましょう笑 
 それと、この手のエラーはよくでるようですが、エラーの内容はググってみたところ千差万別で、自分のエラーはネットには載っていませんでした。なので一応ここに書いてみたのですが、エラー内容にしっかりどこの何がエラーなのか教えてくれているので、しっかりそれをみて自分で修正しましょう!(でも今回のエラーほど簡単なミスは普通しないよね笑)

以上。