いくつか他サイトでも紹介されてるけど、いきなり世界が紫色になってビビる。
開始後にシェーダーを再設定すればOK。AseetBundle使うとシェーダーの参照が壊れるとかなんとか。
foreach (var uchar in UCharForReload)
{
Renderer[] mats = uchar.GetComponentsInChildren<Renderer>();
foreach (var MaterialNow in mats)
{
foreach (var m in MaterialNow.materials)
{
m.shader = Shader.Find(m.shader.name);
}
}
}
で、これでOKかと思いきや、Android環境だとうまく動かんかった。
Always Include Shadersで設定すれば今くいくかも?また今度試してみよう
⇒設定したらOKでした
2016年8月21日日曜日
2016年7月31日日曜日
[Google VR][Unity]GazeInputModuleで注視しているボタンをクリックさせる
デフォルトだとタッチ操作が必要になる。環境によってはタッチ操作用の磁石がないので修正。
まずタイマー用の変数と、クリック動作させるかのパラメーターを追加。
float clickTimer = 0f;
float clickTimerMax = 1f;
public float ClickTimer
{
get
{
return clickTimer;
}
set
{
clickTimer = value;
}
}
public float ClickTimerMax
{
get
{
return clickTimerMax;
}
set
{
clickTimerMax = value;
}
}
[SerializeField]
bool GazeTimeClickMode;
あとはUpdateCurrentObjectを書き換えて、タイマーカウント終了時にExecuteEventsでクリックさせる。
private void UpdateCurrentObject()
{
// Send enter events and update the highlight.
var go = pointerData.pointerCurrentRaycast.gameObject;
HandlePointerExitAndEnter(pointerData, go);
// Update the current selection, or clear if it is no longer the current object.
var selected = ExecuteEvents.GetEventHandler<ISelectHandler>(go);
if (selected == eventSystem.currentSelectedGameObject)
{
ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, GetBaseEventData(),
ExecuteEvents.updateSelectedHandler);
if (GazeTimeClickMode && selected != null)
{
ClickTimer = ClickTimer - Time.fixedDeltaTime;
if (ClickTimer <= 0f)
{
pointerData.pointerPress =
ExecuteEvents.ExecuteHierarchy(go, pointerData, ExecuteEvents.pointerDownHandler)
?? ExecuteEvents.GetEventHandler<IPointerClickHandler>(go);
ExecuteEvents.Execute(pointerData.pointerPress
, pointerData, ExecuteEvents.pointerClickHandler);
ClickTimer = ClickTimerMax;
}
}
}
else
{
ClickTimer = ClickTimerMax;
eventSystem.SetSelectedGameObject(selected, pointerData);
}
}
調べるのが大変だった・・・
まずタイマー用の変数と、クリック動作させるかのパラメーターを追加。
float clickTimer = 0f;
float clickTimerMax = 1f;
public float ClickTimer
{
get
{
return clickTimer;
}
set
{
clickTimer = value;
}
}
public float ClickTimerMax
{
get
{
return clickTimerMax;
}
set
{
clickTimerMax = value;
}
}
[SerializeField]
bool GazeTimeClickMode;
あとはUpdateCurrentObjectを書き換えて、タイマーカウント終了時にExecuteEventsでクリックさせる。
private void UpdateCurrentObject()
{
// Send enter events and update the highlight.
var go = pointerData.pointerCurrentRaycast.gameObject;
HandlePointerExitAndEnter(pointerData, go);
// Update the current selection, or clear if it is no longer the current object.
var selected = ExecuteEvents.GetEventHandler<ISelectHandler>(go);
if (selected == eventSystem.currentSelectedGameObject)
{
ExecuteEvents.Execute(eventSystem.currentSelectedGameObject, GetBaseEventData(),
ExecuteEvents.updateSelectedHandler);
if (GazeTimeClickMode && selected != null)
{
ClickTimer = ClickTimer - Time.fixedDeltaTime;
if (ClickTimer <= 0f)
{
pointerData.pointerPress =
ExecuteEvents.ExecuteHierarchy(go, pointerData, ExecuteEvents.pointerDownHandler)
?? ExecuteEvents.GetEventHandler<IPointerClickHandler>(go);
ExecuteEvents.Execute(pointerData.pointerPress
, pointerData, ExecuteEvents.pointerClickHandler);
ClickTimer = ClickTimerMax;
}
}
}
else
{
ClickTimer = ClickTimerMax;
eventSystem.SetSelectedGameObject(selected, pointerData);
}
}
調べるのが大変だった・・・
登録:
投稿 (Atom)