Unity」カテゴリーアーカイブ

ゲームエンジン「Unity」に関するカテゴリーです。

Collider2D.IsTouchingが常にfalseになってしまう場合

詳細はよく分かりませんが、静止状態でない場合にCollider2D.IsTouchingが正しく判定されないことがあるみたいです。

[Unity] collider.IsTouching(collider) が動いてる状態だとまともに動かない件。バグ?|Unity|エンジニアリングメモ
http://chusotudensi.blog.shinobi.jp/unity/-unity-%20collider.istouchin

ということで、そういう場合はBounds.Intersectsあたりを使って接触判定するなどのworkaroundが使えるみたいです。

if (_Collider.bounds.Intersects(_Collider2.bounds))
{
  Debug.Log("Bounds intersecting");
}

Collider2D.IsTouchingで困っている人は試してみてください。

リンク

Unity – Scripting API: Collider2D.IsTouching
https://docs.unity3d.com/ScriptReference/Collider2D.IsTouching.html

Unity – Scripting API: Collider2D.bounds
https://docs.unity3d.com/ScriptReference/Collider2D-bounds.html

Unity – Scripting API: Bounds.Intersects
https://docs.unity3d.com/ScriptReference/Bounds.Intersects.html

UnityのWebGLゲームを外部からJavaScriptで操作する方法

UnityでビルドしたWebGLのゲームを外部からJavaScriptで操作したい場合、unityInstanceSendMessageを使うと実装できるみたいです。注)

実装の仕方

WebGLでビルドするとindex.htmlというファイルが作られると思いますので、<body>から</body>の間のどこかに

<input type="button" value="ボタン" onclick="…">

のような感じでコードを追加します。

このonclickの部分でunityInstance.SendMessageを実行すればWebGLのゲームにメッセージを送ることができるみたいです。

ExampleオブジェクトのFunctionメソッドを呼び出したい場合

unityInstance.SendMessage('Example', 'Function');

ExampleオブジェクトのFunctionメソッドにvalueを引数として渡して呼び出したい場合

unityInstance.SendMessage('Example', 'Function', value);

※メッセージを送るトリガーとしてボタンを使う必要はありませんので、その辺りは適当に読み替えてください。

リンク

Unity – Manual: WebGL: Interacting with browser scripting
https://docs.unity3d.com/Manual/webgl-interactingwithbrowserscripting.html


注) 古いドキュメントではgameInstanceとなっている場合もありますが、Unity 2019.1以降はunityInstanceに変更されたそうです。

Unityでスクリプトを使って複数枚のSpriteに分割する方法

UnityではSprite ModeをMultipleに設定することで、1枚の画像ファイルから複数枚のSpriteを作成する機能があります。ただ、これで作成したSpriteは基本的に全く別のSpriteとして扱われるので、スクリプトから操作したい時に少し不便なことがあります。

そこで、スクリプトで複数枚のSpriteに変換する方法はないかなと思って調べてみたところ、Sprite.Createを使って作成する方法が簡単かなという感じでした。

使い方

Texture2D texture;
for(...) {
  var rect = new Rect(x, y, width, height);
  Sprite.Create(texture, rect, new Vector2(0.5f, 0.5f), 100.0f);
}

Rectで指定した範囲のSpriteが作られるので、この値を変えていきながら分割していくという形です。

実行時に毎回Sprite.Createを実行することになるのでパフォーマンス的には不利になると思いますが、実用上は問題ないかなと思います。

リンク

Unity – Scripting API: Sprite.Create
https://docs.unity3d.com/ScriptReference/Sprite.Create.html

Unity – Manual: Sprite Editor
https://docs.unity3d.com/Manual/SpriteEditor.html