複製と分裂

以下の作業結果のUnityPackageファイルをレポートフォルダに

GP14Ex4.unitypackage

で置いてある。

オブジェクトの複製について

 C#スクリプトをアタッチしたGameObjectを複製するコードを示す。

参照:

C#のstaticメンバー https://ufcpp.net/study/csharp/oo_static.html

C#のstaticメンバーの初期化のタイミング https://u-1roh.hatenadiary.org/entry/20060902/1157172959

C#のDictionary https://csharp.keicode.com/basic/collections-dictionary-keyvalue.php

C# Dictionary を初期値付き拡張 https://qiita.com/divideby_zero/items/cd6f0c901a434bc891be

C# Dictionary はKeyが存在しないset操作は新しい要素を作成する https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.dictionary-2.item?view=netframework-4.8

黄のCude

移動しながら複製するコードの例。

コードの稼働時間と複製する時間間隔を指定できる。複製元の移動も指定できる。

赤のSphere

緑のSphere

グリッド配置の例。

緑の方は空のGameObjectの子供にCubeを配置して、
親である空のGameObjectにGridDup.csをアタッチして、
子供のCubeに上下に移動するスクリプトをアタッチしてある。

青のCube 2パターン

緑のSphere

回転移動のコードの例

青のCubeは親のGameObjectに子供として配置してある。
回転用スクリプトWaveAnim1は子供の青のCubeにアタッチして、
複製と移動のReplicator.csは親のGameObjectにアタッチした。

WaveAnim1ではアニメーション管理用の連番を持たせることができる。
WaveAnim1をアタッチした複数のGameObject (Cloneで複製されたものを含む)で、連番の管理名を設定しておくことができる。
同じ管理名を持つGameObjectのWaveAnim1では生成された順に管理番号が割り当てられる(0から開始)。
連番の影響度の係数を連番に乗じて、振幅、回転速度、位相に加算している。
影響度が 0 なら連番の影響無し
影響度が +で後から生成されたWaveAnim1のパラメーターは増加する。(マイナスなら減少)

中心の設定:

ReplicatorとWaveAnim1を組み合わせた際に生じる問題を解決する問題の調整用。
下の動画以降の例参照。

前述のコードを組み合わせた応用例

回転しながら縦方向に複製を作る筒

親の空のGameObjectにWaveAnim1をアタッチして回転させる。
子供のCylinderにReplicatorをアタッチして移動しながら複製する。複製元のCylinderは+Y方向に移動していく。
全ての複製されたCylinderの回転は複製元のオブジェクトの回転に同期する。


回転しながらSphereを打ち出すCapsule(奥側)

Sphereは上昇する円周上に配置される。
Sphereが複製された時間のずれに応じて移動の開始時間がずれるので移動の終了時間もずれる。
複製元のSphereは上昇していくので後から複製されたSphereはより上方で移動を終える。
移動終盤でらせん状に配置される。

空のGameObjectを回転の中心の設定用に親にする。
子供のCapsuleにWaveAnim1をアタッチして、中心の設定 Center_local をオフ false にして親を回転の中心に切り替える。
CapsuleにReplicatorをアタッチして自身の複製を作る。
Capsuleの子供にSphereを配置してReplicatorを複製無しの移動用スクリプトとしてアタッチする。


回転しながらSphereを打ち出すCapsule(手前側)

Sphereは螺旋を描きながら上昇する。
複製元のSphereの初期位置に複製を配置している。
複製のSphereは同じ高さで生成されるので移動の終了も同じ高さで終わる(生成されてから移動終了までの時間は同じなので)。

空のGameObjectを回転の中心の設定用に親にする。
子供のCapsuleにWaveAnim1をアタッチして、中心の設定 Center_local をオフ false にして親を回転の中心に切り替える。
CapsuleにReplicatorをアタッチして自身の複製を作る。
Capsuleの子供にSphereを配置してReplicatorを複製無しの移動用スクリプトとしてアタッチする。
Sphereの方のReplicatorの Start_at_ParentをON(True)にして移動の開始位置がSphereの初期位置になるようにする。

前述の応用例2

回転に回転を組み合わせる(太陽・地球・月の関係)

回転体から弾を打ち出す

前述のコードを組み合わせて実現できる。

分裂アニメーション


前述の移動しながら自身のcloneを一定の時間間隔で配置するコードの修正版。

clone側のスクリプトを無効にせずにcloneからもcloneを発生させる。

生成したcloneの移動方向を設定可能。Vector3で移動速度とともに設定する。

分裂は上下左右前後の6方向に分裂する。(cloneが6個生成される)

分裂数は0~6個を設定できる。移動方向と速度は標準で上下左右前後。この順にVector3で修正可能。

cloneの倍率を変更できる。

スケール変更のアニメーション


拡大縮小を周期的に繰り返すコードの例

回転アニメーション1


wave =true の場合、周期的に角度を変更する。

手を振るとか、ブランコの様な揺り戻しが起きる回転を表現できる。

360度を超える角度変更のアニメーションの場合、正回転と逆回転を交互に繰り返すようになる。


回転アニメーション2


前述のコードで wave =true で使用した例。

時間に従って角度を一方向に変化するようになる。(回転し続ける)

右の動画のデモではオブジェクト毎に回転速度を増すように、連番の設定を調整してある。