2014年9月24日 星期三

Kanzi StateMachine


在Editor中使用StateMachine 發現幾點要注意的地方

一開始想做一個循環的button,循環某一個State Manager

所以使用Toggle Button。

例如我有5個State,讓Toggle Button也有5個State對應。

首先先將Button中 加入一個Number of Toggle Button屬性,設成5

接著,新增Button: Toggle State 這個Trigger。之後,就對文件中的說明看不懂,試了很久才發現:

1.在Trigger Settings中,新增一個Condition,Property > Button Toggle State, Condition > =, Fixed Value > 0

2. Add一個Set property的Action,把State的值設成0。

3. 5個State的話,就要新增5個Button : Toggle State。

如果要有要使用State Manager: State Entered 這個Trigger的話,要加在Target物件(後面測試State Object跟Target都可以),而不是State Group,也不是Button上。同樣地也要在這個Trigger Setting中,設定Condition,不然只要State改變,都會進去。注意: Condition 中的Message Source要改成target物件。不能用預設值  後來發覺跟Message Source無關,是我的property名稱叫State,如果直接在下拉選單key入state 搜尋,會變成MessageArgument.StateManager.State ,但若在選單裡自己找,用選的,就會是我的state。應該是跟內建的名稱衝到,選到第一個是內建的名稱。

如果要用State Manager改變Target物件的屬性,記得要把Target上的對應屬性移掉。例如,在State Object上有Ambient Color這個屬性,要改變Sphere上的Ambient Color的話,要把Sphere上的Ambient Color 移掉。

這個設定成功後,才發現,原來Trigger 裡有一個State Manager: Go to Preview State 這個屬性。但一開始也試不出來,也沒文件。 後來試出,State Group 名稱設成要用的State Manager下的State Group,再把Dispatch Settings中的Routing Target,設成Target物件 (有State Manager那個)

這樣這個就可以做左右的循環State

後記:又出現問題了....用Go to Preview State的方式,沒辦法讓Target物件用它的State Property來判斷現在是在哪個State,前面的方式無法用。目前還找不到對應的值是什麼。後來用了一個蠢方法,在Property Type再增加一個叫State Name的property。在State Object上加入這個屬性,之後在Target物件上的Condition來判斷這個Name,就可以知道是在哪個State......不知正統的解法什麼

經過測試,在State Object上也可以用trigger知道State Enter,但State Left我搞不懂它的邏輯,在同一個State Object上,設Enter跟Left,在進入這個State時,會同時觸發。感覺是別人Left進這個State.....但又不知是誰的State進來呀 X的.... wtf

 用了一個蠢方式,設一個空Node 叫Pre State,上面有個像之前的StateName property。因為Left會發生在Enter之前,所以在Enter時,用Set Property 把空Node的StateName設定Current的名稱,因為left 進入時還沒更改,所以會抓到pre state,這樣就可以知道從哪State出來了..........應該有標準做法吧...但文件沒寫... x的

沒有留言 :

張貼留言