ぱふの自由帳

週3更新(火・木・日)を目指すUnityブログ。良ければフォローお願いします(`・ω・´)

DOTweenPathで設定した動きを一時停止する方法

はじめに

今回、視覚的に移動を設定可能ということで”DOTweenPro”を購入しましたー。現在作成中のシューティングゲームでの敵の移動パターンをGUIで設定できて便利です(`・ω・´)

で...本題です。以下の画像のコンポーネントをアタッチして設定したアニメーションってどうやって止めるの?となったので一時停止する方法をメモしておきます。

f:id:PafuOfDuck:20171127162002p:plain

一時停止方法

以下のコードで一時停止してくれます。

GetComponent<DOTweenPath>().DOPause();

動きを再開したい場合は以下のコードです。

GetComponent<DOTweenPath>().DOPlay ();

おわり

実はTwitterで解決方法を募集したんですが...ビックリするぐらいすぐに解決しました(`・ω・´)

答えてくださった方や拡散していただいた方々には頭が上がりませぬ。(┐「ε:)

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のフォローお待ちしています...(`・ω・´) ヨロシク!

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

この記事について

注意事項

  • 特に断りがない限り、C#について記述しています
  • 個人的に知らなかったこと、誰かの役に立ちそうな事をまとめています

レッスンタイトル一覧

1.13 Translate and Rotate
1.14 Look At
1.15 Linear Interpolation
1.16 Destroy
1.17 GetButton and GetKey
1.18 GetAxis
1.19 OnMouseDown
1.20 GetComponent
1.21 Delta Time
1.22 Data Types
1.23 Classes
1.24 Instantiate
1.25 Arrays
1.26 Invoke
1.27 Enumerations
1.28 Switch Statements

n秒後にDestory

GameObjectを生成してから5秒後にDestroyしたいという時は以下のように書くことが出来ます。

void Start () {
    GameObject.Destroy (gameObject, 5f);
}

私はInvokeやコルーチンでDestroyを遅らせていました...。全く知らなかったです(´・ω・`。)

GetKey と GetButton

この二つは同じような使い方をすれば同じように動きます。ですが、Unityの公式はGetButtonを推奨しています。理由をググった結果、以下の記事で納得できたので紹介しておきます。

qiita.com

OnMouseDown

ユーザーがGUIElementまたはColliderを持つオブジェクト上でマウスボタンを押したとき、そのオブジェクトにOnMouseDown関数が設定されていれば呼び出されます。 しかし、Layerの設定がIgnore Raycastであれば呼び出されません。

以下はCubeにスクリプトをアタッチしています。

f:id:PafuOfDuck:20171030071437g:plain

値型と参照型

値型

値型の例として

  • int / float / double:数値を格納

  • bool:真偽値を格納

  • Structs:Vector3やQuaternionのような2つ以上の変数を持つ構造体

といったものがあります。

実際に変数の中に値が入っているのが特徴です。以下のようなスクリプトを実行してもスクリプトがアタッチされているオブジェクトは特に変わりません。これは変数posが値型であり、新たな値を代入するとpos自身の値が変更されているだけだからです。

void Start () {
    Vector3 pos = transform.position;
    pos = new Vector3 (0, 2, 0);
}

参照型

参照型は

変数が値の格納されているアドレスを持っているのが特徴です。以下のようなスクリプトを実行するとスクリプトがアタッチされているオブジェクトは(0,2,0)に移動します。これは変数tranが参照型であり、参照先の値を変更したために同じ場所を参照していたオブジェクトが動いたということです。

void Start () {
    Transform tran = transform;
    tran.position = new Vector3 (0, 2, 0);
}

Invoke系まとめ

Invoke(string methodName, float time)

Invoke("関数名", 実行までの待機時間)という感じで使用します。

void Start () {
    Invoke ("Hogehoge", 2f);
}

void Hogehoge(){
    Debug.Log ("ほげー");
}

これで開始から2秒後に「ほげー」という文章が出力されます。

注意点としては下の二つぐらいですかね。

  • void関数のみしか呼べない
  • 引数を渡せない

InvokeRepeating(string methodName, float time, float repeatRate)

InvokeRepeating("関数名", 実行までの待機時間, 再実行までの待機時間)という感じで使用します。

void Start () {
    InvokeRepeating ("Hogehoge", 2f, 1f);
}

void Hogehoge(){
    Debug.Log ("ほげー");
}

これで開始から2秒後に「ほげー」という文章が出力された後、1秒ごとに「ほげー」という文章が出力されます。

CancelInvoke(string methodName)

CancelInvoke("キャンセルする関数名")という感じで使用します。Invoke()やInvokeRepeating()で実行予定であった関数を指定してキャンセル出来ます。なお、キャンセルする関数名を書かないと全ての実行予定の関数をキャンセルしてしまいます。

ひとこと

OnMouseDownは上手く使えば、タッチされた場所取得してRay飛ばして...とかせずに済みそうですね(^^)

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

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

この記事について

注意事項

  • 特に断りがない限り、C#について記述しています
  • 個人的に知らなかったこと、誰かの役に立ちそうな事をまとめています

レッスンタイトル一覧

1.8 Awake and Start
1.9 Update and FixedUpdate
1.10 Vector Maths
1.11 Enabling and Disabling Components
1.12 Activating GameObjects

Awake()に注意

Awake()スクリプトが非アクティブでも実行される。
参考リンク:Scriptを非アクティブにしても生き残る関数たち

Start()の実行タイミング

Start()スクリプトがアクティブな状態での最初のフレーム(Update()の前)で一度のみ実行される。アクティブなスクリプトを一旦、非アクティブにした後に再びアクティブにしても実行されないことに注意。

ベクトルのプチまとめ

長さ

長さは”Magnitude”と呼ばれる。自前で計算しなくて済むように変数(Vector2.magnitudeVector3.magnitude)が用意されている。

内積

二つのベクトルの各要素を掛け合わせたものの和。和が0になるかどうかでベクトルが垂直であるかどうかの判断に使うことが出来る。

使用例:飛行機が地面に対して水平かどうかを調べる

なお、内積を計算する関数(Vector2.DotVector3.Dot)が用意されている。

外積

二つのベクトルに垂直なベクトルを生成する。二つのベクトルからなる平面に垂直なベクトルが誕生するイメージ。当たり前だが、2Dでは概念自体が存在しない。

使用例:戦車の放題の回転前後のベクトルから回転軸ベクトルを求める

なお、外積を計算する関数(Vector3.Cross)が用意されている。

enable と SetActive()

公式チュートリアルコンポーネントのアクティブ切り替えにはenableを、GameObjectのアクティブ切り替えにはSetActive()を使用していたので従うのが吉?

activeSelf と activeInHierarchy

activeSelf:自身がアクティブかどうか
activeInHierarchy:実際にアクティブかどうか

分かりづらいと思うので具体例を以下に示します。

f:id:PafuOfDuck:20171030024913p:plain
上画像のような構造になっているオブジェクトがあるとする。この時のBについて見ていく。

  • Aがアクティブ / Bがアクティブ
    activeSelf → true
    activeInHierarchy → true

  • Aがアクティブ / Bが非アクティブ
    activeSelf → false
    activeInHierarchy → false

  • Aが非アクティブ / Bがアクティブ
    activeSelf → true
    activeInHierarchy → false

  • Aが非アクティブ / Bが非アクティブ
    activeSelf → false
    activeInHierarchy → false

親が非アクティブな時点で子も非アクティブ扱いになるのでactiveInHierarchyは親が非アクティブであれば100%falseになりそうですね(`・ω・´)

ひとこと

activeSelf と activeInHierarchy...。私は何に使えるか思いつきませんが役に立つ時が来るんでしょうね...(´・ω・`。)タブン

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