2024年8月7日記録
カードをドラッグする時の処理で、カードのオブジェクトが持つpositionをどうするかで悩んでいたので色々調べた。
本当にRectTransformがスクリーン座標で、Transfromがワールド座標という使い分けなのか?
下記の記事が分かりやすい。
ワールド座標とローカル座標。
マウスの位置をスクリーン座標からワールド座標に変換してTransformのpositionに代入した場合。
- ヒエラルキー上でルートにあるオブジェクトはマウスの位置に表示される
- 親オブジェクトがある場合は親が基準からずれている分だけズレる。
未検証。要検討。
いや、ズレなそう。ローカル座標に代入したらズレるはず。
Unity – ワールド座標、ローカル座標、スクリーン座標、ビューポート座標
話の趣旨とは違うが面白そうな記事に出会った。
コメントアウトを外すとドラッグを辞めた瞬間変な位置に飛ばされる。
親子関係が関係してそうだけどどうなってるのか分からない。今は飛ばす。
Dotweenの処理が開始する前に親が変わって、うーん。
DOTWeenのSequenceについて
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.
https://dotween.demigiant.com/documentation.php
NOTE: has no effect if the tween is added to a Sequence.
DOTween中にそれをしているオブジェクトが破壊されても、DOTweenは破壊されない。なので、DOTweenが破壊されたオブジェクトにアクセスしようとする、そのオブジェクトがないよとエラーが発生する。SetLink(gameOjbect)をしておくと、gameObjectがアクティブかどうかでDOTweenの処理を実行し続けるか判定してくれる。
OnCompleteとOnKillについて
疑問
何事も無く処理が終了したら、OnCompleteの後にOnKillは呼ばれるのか。
答え
呼ばれる。
根拠
以下の文章で、completionの後にkillが自動的に呼ばれると書いてあるので。
Kill
Kills the tween.
https://dotween.demigiant.com/documentation.php
A tween is killed automatically when it reaches completion (unless you prevent it usingSetAutoKill(false)
), but you can use this method to kill it sooner if you don’t need it anymore.
補足
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
インスタンス化したオブジェクトのAwakeにDebug.Log(“Instantiate1");
インスタンス化する処理を書いた関数の中でInstatiateの後にDebug.Log(“Instantiate2");を書いた。
結論
あるメソッドでInstantiateをしたら
1.インスタンス化されたオブジェクトのAwakeメソッド
2.あるメソッドのInstantiate以降に書かれている処理
3.インスタンス化されたオブジェクトのStartメソッド
の順番で実行される。多分Startは別フレームで処理されてるのかも。
追加
あるオブジェクトをenable=trueにしたときにStartがいつ呼ばれるかを検証したい。
ディスカッション
コメント一覧
まだ、コメントがありません