2024年8月7日記録

カードをドラッグする時の処理で、カードのオブジェクトが持つpositionをどうするかで悩んでいたので色々調べた。

【Unity】ワールド座標とスクリーン座標

本当にRectTransformがスクリーン座標で、Transfromがワールド座標という使い分けなのか?

下記の記事が分かりやすい。

【Unity】スクリーン座標をワールド座標に変換する方法

ワールド座標とローカル座標。

マウスの位置をスクリーン座標からワールド座標に変換してTransformのpositionに代入した場合。

  1. ヒエラルキー上でルートにあるオブジェクトはマウスの位置に表示される
  2. 親オブジェクトがある場合は親が基準からずれている分だけズレる。

未検証。要検討。

いや、ズレなそう。ローカル座標に代入したらズレるはず。

Unity – ワールド座標、ローカル座標、スクリーン座標、ビューポート座標

話の趣旨とは違うが面白そうな記事に出会った。

 ShaderGraphの座標空間

コメントアウトを外すとドラッグを辞めた瞬間変な位置に飛ばされる。
親子関係が関係してそうだけどどうなってるのか分からない。今は飛ばす。
Dotweenの処理が開始する前に親が変わって、うーん。

DOTWeenのSequenceについて

Nomenclature

Sequence sequence = DOTween.Sequence();

で取得できる。

SetLink

Links this tween to a GameObject and assigns a behaviour depending on its active state. This will also cause the tween to be automatically killed when the GameObject is destroyed.
NOTE: has no effect if the tween is added to a Sequence.

https://dotween.demigiant.com/documentation.php

DOTween中にそれをしているオブジェクトが破壊されても、DOTweenは破壊されない。なので、DOTweenが破壊されたオブジェクトにアクセスしようとする、そのオブジェクトがないよとエラーが発生する。SetLink(gameOjbect)をしておくと、gameObjectがアクティブかどうかでDOTweenの処理を実行し続けるか判定してくれる。

OnCompleteとOnKillについて

疑問

何事も無く処理が終了したら、OnCompleteの後にOnKillは呼ばれるのか。

答え

呼ばれる。

根拠

以下の文章で、completionの後にkillが自動的に呼ばれると書いてあるので。

Kill

Kills the tween.
A tween is killed automatically when it reaches completion (unless you prevent it using SetAutoKill(false)), but you can use this method to kill it sooner if you don’t need it anymore.

https://dotween.demigiant.com/documentation.php

補足

Kill(true)でsequenceをkillした場合はOnCompleteの後にOnKill呼ばれる。Kill(false)ならOnComplete(が呼ばれずにOnKillだけが呼ばれる。

この方の記事も勉強になる。

【Unity】永久ループするDOTweenの止め方と落とし穴

やりたいこと

CardオブジェクトがScript内でデッキのTransformを自主的に取得して欲しい。
1.カードをドローする処理発動
2.カードをインスタンス化
3.カードを初期化。この時にデッキの位置から手札の位置まで移動させる処理を実行する。

3の処理で、デッキのTransformがなくてエラーになる。
Transform deckTransform = GemeObject.FindWithTag(“Deck");
をいいタイミングで児童に実行して欲しい。

解決方法

 after a GameObject created with Object.Instantiate is initialized. Use Awake to initialize variables or states before the application starts.

https://docs.unity3d.com/ja/2020.3/ScriptReference/MonoBehaviour.Awake.html

MonoBehaviour.Awake()

MonoBehaviour.Start()

インスタンス化したオブジェクトのAwakeにDebug.Log(“Instantiate1");

インスタンス化する処理を書いた関数の中でInstatiateの後にDebug.Log(“Instantiate2");を書いた。

結論

あるメソッドでInstantiateをしたら

1.インスタンス化されたオブジェクトのAwakeメソッド
2.あるメソッドのInstantiate以降に書かれている処理
3.インスタンス化されたオブジェクトのStartメソッド

の順番で実行される。多分Startは別フレームで処理されてるのかも。

追加

あるオブジェクトをenable=trueにしたときにStartがいつ呼ばれるかを検証したい。

活動報告

Posted by admin