ぱふの自由帳

ぱふの技術ブログ。メインはUnity。最近はUnity1Weekの放送してます。良ければフォローお願いします、、

Rayを飛ばすのはもう古い?!簡単にオブジェクトのクリックを検知だ!

はじめに

オブジェクトのクリックを検知する際にどうやっていますか?
ググったサイト見て、Ray飛ばすコード書いて...ってやってるあなたに朗報です!もっと簡単に実装できますよ!

さっそく実装

  1. まず動かしたいオブジェクト(今回はCube)を用意します。
  2. CubeにEvent Triggerを取り付けてAdd New Event Typeからイベントを選びます。今回はPointerDown(マウスボタンが押仕込まれた時に呼ばれるやつ)を選びました。
    f:id:PafuOfDuck:20171120132045p:plain
  3. UIのButtonと同じようにスクリプト内の関数を呼び出し設定をします。今回はCubeオブジェクトにCubeスクリプトをつけています。
    f:id:PafuOfDuck:20171120132052p:plain
  4. CameraにPhysics Raycasterコンポーネントを取り付けます。
    f:id:PafuOfDuck:20171120132101p:plain
  5. Event Systemがシーン状に存在しなければヒエラルキーウィンドウのCreateから作成します。 設定はデフォルトのままで構いません。 f:id:PafuOfDuck:20171120132106p:plain

これだけです!簡単だと思いませんか?
以下が実行した時の動画です。 f:id:PafuOfDuck:20171120141306g:plain

注意!

二つほど注意点があります。

  • Colliderは必須
  • 2Dの場合はColliderとPhysics Raycasterを2Dのものにする。

おわり

どうでしたか?私自身、この前開催されたunity1weekの作品を開発中に知りました...。かれこれ半年ほどunityでRay飛ばし続けてきたんです...笑

PointerDown以外のイベントを駆使するとUIのボタンよりも便利なものになりそうですねー(`・ω・´)

ではでは。(┐「ε:)

unity1week投稿作品を振り返る

おはこんばんにちは。ぱふです。
ずっと参加するぞするぞ詐欺を行っていた"unity1week"に作品を投稿したので少しまとめたいと思います(`・ω・´)

メモ:作成期間3日(内、ガルパンを10時間ぐらい見ながら作業してました)

投稿作品

ホシつなぎというゲームを作成しましたー。ホシをロケットの軌跡でつないでいくミニゲームです。

f:id:PafuOfDuck:20171119172114p:plain

どんな感じのゲームか詳しく知りたい方は以下のリンク先で遊んでみて下さい。
注意:2017/11/19 20:00以降でないとゲームで遊べません。

”ホシつなぎ|無料ゲーム投稿サイト unityroom”

今回得た知識

Event Triggerの存在

2DのオブジェクトがクリックされたかどうかをUnity駆け出しの頃からずっと、クリックした場所取得して...ポジション直して...Rayを飛ばして...ってやってました。 しかーし、今回初めてEvent Triggerの存在に気づいたのです。
もぅ便利便利。ボタンより融通の利くものが簡単に作れちゃいます。気になった方はググってみて下さい。記事がいくつか引っかかるはずです。

WebGLでの日本語出力

Unityにデフォルトで入ってる"Arial"だと日本語表示されないよ!エディタ上では上手くいくから変なバグと勘違いしないように注意だよ!
まぁ、unityroomにも書いてるし大丈夫でしょ。

...。はい。大丈夫ではありませんでした。綺麗さっぱり忘れてハマりました。皆さん注意して下さいね。

unityroomの仕様

「めっちゃ使いやすくて草www」と草に草を生やしてしまうほど簡単でした(`・ω・´)b 管理人のnaichiさんが作ったのかな。すごいな。という小学生並みの感想しか出て来ませんが、簡単にアップロードできます。

神イベントの恩恵

現在、”unityroom & 1week GAMEJAMの投稿作品にアセットを登録してバウチャーをゲットしよう!”というキャンペーンが行われています。

これが強力です。バウチャー目的で量産すると審査に落ちる可能性がありますが、普通にゲームを作れば貰えそうな雰囲気を醸し出しています。
有料だけでなく無料アセットでもおkなのでアセット買うお金出せない...。って方は無料アセットを駆使してゲームを作ってみてはいかがでしょうか...!
グイグイ押してますが、Unityの回し者ではありませんよ...!笑

ちなみに、最高で 20ドル/アセット 貰えるので私はエディタ拡張買っちゃいました (┐「ε:)

バウチャーを貰えたら記事でおしらせしますね(`・ω・´)

おわり

ざっくりですが、unity1weekでの振り返りは終了です!
こうやってアイディア出したよ!的な記事を期待していた方すいません。

これを機に毎回参加していこうと思いますー。(超絶フラグ
ではAssetを紹介して終わります。ノシ

使用したAsset

-3Dモデル-

Space Asteroids

隕石の3Dモデル集

-エディタ拡張-

Rainbow Folders

他の方が使っているのを見て綺麗だったので導入。見栄えが良くなりやる気が少しアップする。(個人差があります笑

Panic Button

有名アセットの一つ?無限ループのフリーズから逃げ出せる。

Object Labels / Notes

オブジェクトに付箋貼る感覚で使えるのでとても便利。
ただ、Prefabから生成されたものにアタッチしようとすると「Prefabが壊れるぞ?」というメッセージが何度か出る....。(キャンセル連打で特に何も起こりません

Asset Hunter 2

Assetフォルダ内の使用していないデータを見つけ出してくれる。
ゲームに使用しているデータを「これ使ってないわー。削除っと(ポチー」とやってしまったとても悲しい経験から導入。

Hierarchy Tag Icons

Hierarchyウィンドウでタグに応じた画像を表示できる。
タグのつけ忘れやつけ間違いを見た目で判断できることも。

-オーディオ-

Into the Fire

「アセットキャンペーンもあるし有料なBGM買おうかな」と思った時に出会った。ミニゲームとして作った作品にぴったりだと感じて採用。ループにも対応しています。$2~3なら有料でも買ったと思う。

Zero Gravity

"Into the Fire"と同じ理由で採用。有料でも買ったと思う。

SciFi UI Sound FX

-パーティクルシステム-

Explosive Realistic VFX Texture Free

-スクリプト-

iTween

Tween系で最も(日本語の)参考サイトが多い。
しかし、私はDOTweenに乗り換える予定です...。

-テクスチャ&マテリアル-

2D Cartoon Missiles

スペースシャトルとして使用。煙のパーティクルが地味に嬉しい。

105 Colorful 2D Planet Icons

シンプルな惑星が想像していた世界観と合っていたので採用。105というたくさんの惑星があるのも嬉しい。

GalaxyBox 1.0

このゲーム実は最初の段階では3Dにしようと思っていたのでSkyboxを採用していた際の名残(笑
GalaxyBox 2.0もあるのでそっちものぞくと良い。

-Unity提供アセット-

Unity Samples: UI

誰もが一度見たことはあるハズ。ついに宇宙ものを作成したので採用。

"Look rotation viewing vector is zero"というログを吐くバグ

下の写真のような感じでログが大量に出ました。(おそらくバグです。

f:id:PafuOfDuck:20171117151122p:plain

発生条件

以下を満たした時に発生するのを確認しています。

  • Unityが2Dモード
  • Canvasの子オブジェクト(Aと名付けます)でRect Transformの"Width / Height"の片方が0
  • Hierarchy内でAの子オブジェクトを選択する

解決方法

”Rect Transformの"Width / Height"の片方が0にならないように設定する”のが最も手軽だと思います。

string型をint型に変換する【Unity】

私「文字列を整数に直すぞー。キャスト変換とか慣れたもんよ。」

int num = (int) "123";

私「よゆーよゆー。」

Unity「Cannot convert type 'string' to 'int'」

私「...。」

というわけで文字列を整数に直す方法を紹介します。

変換方法

以下の方法で変換できます。他にもあるとは思いますが...。

// 方法その1
int num = int.Parse("123");

// 方法その2
int num = Convert.ToInt32("123");

おわり

数値から数値ぐらいの簡単な変換なら()で変換できるんですかねー。 ちなみに、変換するときのオプションが指定できるのでググってみてください(`・ω・´)

【Unity公式チュートリアル】スクリプティング〈レッスン2.1-2.18〉

この記事について

注意事項

  • 特に断りがない限り、C#について記述しています
  • 私&誰かの役に立ちそうなプチ知識をまとめています
  • 今回からレッスンタイトルにざっくりとした概要をつけました!←new!

レッスンタイトル&概要一覧

2.1 Properties
プロパティはカプセル化に役立つというお話。

2.2 Ternary Operator
三項演算子のお話。

2.3 Statics
Staticsとは?というお話。

2.4 Method Overloading
オーバーロードって?どういう優先順位で実行なの?というお話。

2.5 Generics
下のコードを見て「あ。ジェネリックじゃん。」って方は飛ばしておk。

public T GenericMethod<T>(T param)
    {
        return param;
    }

2.6 Inheritance
継承って聞いたことあるけどよく知らない...という方はみると良いかも。

2.7 Polymorphism
ポリモーフィズムについてというタイトルだがアップキャストとダウンキャストの話が主になっている。継承がよく分からない方には難しい?

2.8 Member Hiding
継承のときに使うnewのお話。

2.9 Overriding
オーバーライドのお話。

2.10 Interfaces
インターフェースについて簡単に解説している。

2.11 Extension Methods
拡張メソッドの意味 / 実装 / 呼び出し方法を解説している。

2.12 Namespaces
名前空間の作り方と使い方の説明。

2.13 Lists and Dictionaries
リストと辞書の基本的な使い方について。リストをMyルールでソートするための方法についての解説も少しだけある。

2.14 Coroutines
コルーチンの使い方の説明。「プロパティと組み合わせると効果があるよ。」という話も入っている。

2.15 Quaternions
クォータニオンの理論的な説明をするのではなく、Quaternionクラスに用意されている関数の使い方が主な内容。使ったことがない方は一度見ておくと何かと役に立ちそう。

2.16 Delegates
デリゲートについての話。以下のコードが「?」な方は是非見るべし。ただ、0知識からだと少し辛いかも?

delegate void MultiDelegate();
MultiDelegate myMultiDelegate;
    
void Start () {
    myMultiDelegate += PowerUp;
    myMultiDelegate += TurnRed;
    
    myMultiDelegate();
    }
    
    void PowerUp() {
        print ("Orb is powering up!");
    }
    
    void TurnRed() {
        renderer.material.color = Color.red;
    }

2.17 Attributes
属性の話。「属性?コードのあの部分でしょ?」って方は見なくてOK。「属性?なにそれおいしいの?」って方は一度眼を通すと良い。

2.18 Events
イベントの発生や購読 / 解除の仕方を説明。便利なので知らない方は見ておく価値あり。デリゲートの知識がないとわからないので注意。

オーバーロード時、どれが実行される?

  • 引数が完全一致するメソッドが存在する
    →そのメソッドが実行される

  • 引数が完全一致ではないが実行可能なメソッドが存在する
    →変換の少ないメソッドが優先的に実行される

  • 実行可能なメソッドが存在しない
    →エラー

new と overrideってどう違うの?

「たまには真面目に解説作るぞ!」と思って絵を書いているのですが間に合いそうに無いので私がすっきりした記事を紹介しておきます。

gacken.com

解説記事が出来上がったら差し替えます...(`・ω・´)

ひとこと

チュートリアルが各項目のさわりをさらっと解説しているので豆知識部分が少なくてすいません...。「デリゲートの解説!」みたいな項目作っちゃうとチュートリアル外の部分も解説しなきゃなので見送っています。面倒って理由もあr...

この先も豆知識的なの書けないままチュートリアルが進みそう...(´・ω・`。)

初心者/熟練者を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

publicな変数をInspectorに表示しない方法

はじめに

前回の記事《privateな変数やクラスをInspector上に表示する方法》の逆のようなことをやっていきます。

方法

その1: [HideInInspector]

[HideInInspector]
public int hoge = 10;

上のような使い方をするとInspector上から消えます。

しかし、注意が1つ!
これは見えなくなっているだけで、プレハブがこそっと値を保持し続けます。なので上のコードを書いていたとしても[HideInInspector]を使用する前にInspector上で書き換えていると"hoge=10"が保証されなくなります。

その2:[System.NonSerialized]

[System.NonSerialized]
public int hoge = 10;

上のような使い方をすると同様にInspector上から消えます。

しかし、先ほどとは違い”変数がこの値に初期化されます。”

どっちが良いの?

その1とその2を紹介しましたが特に強い目的がない限りは”その2”を強くオススメします!

おわり

その1は私は使用したことありません!使いどきがわかりませぬ(´・ω・`。)

初心者/熟練者を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!

privateな変数やクラスをInspector上に表示する方法

はじめに

「privateで扱いたい、でもpublicのようにInspector上に可視化したい...。気をつけながらpublic使うしかないのか...。」という方向けの記事です。

表示方法

変数

[SerializeField]を変数の前につけるだけです。

クラス

[System.Serializable]をクラス定義の前につけるだけです。

関連記事

おわり

見えるようになると結構便利です!デバッグや変数に参照したいオブジェクトやコンポーネントを入れる操作が楽になりますヨd( ̄  ̄)

初心者/熟練者を問わずTwitterのフォローお待ちしています...(`・ω・´) ヨロシク!