説明:
次の例では、Script Test の Proceed ハンドラから Age Test の Proceed メソッドへのアクセスを示します。
用途:
Script_Test: ヘルパー内部で使用し、Age_Test: ヘルパーにアクセスする必要があります。
効果:
Init ハンドラにおいて Script_Test テストは、一意の Age Test アクションを作成するか、それが作成済みの場合は既存の Age Test アクションにアクセスします。次に、Age Test の Proceed メソッドを呼び出し、テスト結果を取得します。さらに、Age
Test をまだ通過していないパーティクルのみを取り出し、球状ボリュームと照合します。ボリューム内部に落下しているパーティクルも、Script Test を通過します。
テストで True の返されたパーティクルは 2 番目のイベントに渡され、そこで停止します。最終結果は、すべてのパーティクルが古すぎるために停止するか、球状ボリュームに入ってしまっているために停止するかのどちらかです。
サンプル シーンでは、スクリプトによってテストされる球状ボリュームは、半径 20 の天球体で表されています。パーティクルは、球のサーフェスに残っているか、サーフェスの通過後、エージが球の範囲を超えたために停止しているかのどちらかです。
例:
|
--ChannelsUsed ハンドラは、スクリプトに提供される
--チャンネルを定義します。
--すべてのチャンネルのリストについては、
--インタフェース: MaxscriptParticleContainer を参照してください。
--ハンドラに渡されるパラメータ pCont には
--スクリプトの適用先のパーティクル コンテナが含まれています。
on ChannelsUsed pCont do
(
pCont.useTime = true --時間チャンネルを有効にします。
pCont.usePosition = true --位置チャンネルを有効にします。
pCont.useAge = true --エージ チャンネルを有効にします。
)
--初期化時には Init ハンドラが呼び出されます。
--この例では、Init ハンドラを使用して、Age Test が存在していなければこれを作成し、
--存在していればこれを取得します。
on Init pCont do
(
globalageT
--一意のオブジェクトが存在していない場合
if $ageTest77777 == undefined then
(
--イベントの自動カプセル化を無効にします。
particleFlow.BeginEdit()
--新しい Age Test を作成します。
ageT = Age_Test()
--これに一意の名前を付けます。このコードを何度も再利用する場合は、
--数字を変更して ID が一意になるようにします。
ageT.name ="ageTest77777"
--編集モードを無効にして、自動カプセル化を有効にします。
particleFlow.EndEdit()
--Age Test の値を 1600 ティックに設定し、変動なしにします。
ageT.Test_Value = 1600
ageT.Variation = 0
)
else
ageT = $ageTest77777--オブジェクトが存在する場合は、それを取得します。
)--Init ハンドラを終了
--Proceed ハンドラでは、Script Test によって Age Test の
--Proceed メソッドを呼び出して結果を取得し、次に、
--球状ボリュームに対する Age Test をまだ通過していない
--パーティクルを検査します。
on Proceed pCont do
(
--現在のパーティクル数を取得
count = pCont.NumParticles()
--正確な開始時間と終了時間を取得します。
t_start = pCont.GetTimeStart()astime
t_end = pCont.GetTimeEnd()astime
t_start_frac = (pCont.GetTimeStart()asfloat) - (t_startasinteger)
t_end_frac = (pCont.GetTimeEnd()asfloat) - (t_endasinteger)
--BitArray を初期化して結果を保存します。
testResult = #{}
--Array を初期化してテスト回数を保存します。
testTime = #()
--Age Test の ProceedStep1 メソッドを呼び出します。
ageT.proceedStep1 (pCont.GetParticleContainer()) (pCont.GetParticleSystem()) (pCont.getParticleSystemNode()) (pCont.getActionNode()) (pCont.getIntegrator())
--Age Test の ProceedStep2 メソッドを呼び出します。
--結果は参照変数内で返されます。
ageT.proceedStep2 t_start t_start_frac &t_end &t_end_frac &testResult &testTime
--パーティクル システムが未定義でない場合は、
ifpCont.GetParticleSystem() != undefinedthen
(
--すべてのパーティクルを処理します。
foriin1tocountdo
(
--i 番目のパーティクルが Age Test を通過したら
if(testResult[i])then
(
--現在のパーティクル インデックスを設定します。
pCont.particleIndex = i
--パーティクルのテスト ステータスを true に設定します。
pCont.particleTestStatus = true
--パーティクルのテスト時間を、Age Test によって返された時間に
--設定します。
pCont.setParticleTestTimePrecise i t_start testTime[i]
)
else
(
--現在のパーティクル インデックスを設定します。
pCont.particleIndex = i
--半径 20 の球の内側にあるパーティクルはすべて
--テストをクリアします。
iflength(pCont.particlePosition) < 20then
(
--パーティクルに、テストを通過したことを伝えます。
pCont.particleTestStatus = true
--さらに、テスト時間を現在のパーティクルの時間に設定します。
pCont.particleTestTime = pCont.particleTime
)
)
)
)
)
onRelease pContdo
(
)
|