Unity GameObject "flash" 在 Android 项目上的 SetActive 之后
Unity GameObject "flash" after SetActive on Android Project
我有一个项目使用 Android 来显示 Unity Player。所以我将 Untiy 项目导出为 Android 模块,由 Android 应用程序实现。
我在 Android Activity 中创建按钮,其中包含 UnityPlayer,当我单击按钮时,它会向 Unity Player 发送一条消息以调用 C# 函数,就像这样:
findViewById(R.id.btnChange).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUnityPlayer.UnitySendMessage("ScriptHolder", "ChangeSkin", "");
}
});
而名为“ChangeSkin”的函数只是改变一些GameObjects的活动。就像这样:
void ChangeSkin()
{
int prefab;
if (_currentPrefab == PREFAB_DEFAULT)
{
prefab = PREFAB_PRINCESS;
}
else
{
prefab = PREFAB_DEFAULT;
}
ShowSkin(prefab);
}
private void ShowSkin(int prefab)
{
_currentPrefab = prefab;
foreach (var item in _defaultDressList)
{
item.SetActive(prefab == PREFAB_DEFAULT);
}
foreach (var item in _princessDressList)
{
item.SetActive(prefab == PREFAB_PRINCESS);
}
}
还有一些奇怪的事情发生了:当我在Unity中点击按钮改变人物的布料时,调用SetActive(true)
的GameObjects显示在一帧正确位置上方的位置并变得正常,看起来他们闪光。这是项目演示的gif:
看起来位置偏移等于状态栏的高度。如果我在 Unity Scene 上创建一个按钮并调用“ChangeSkin”函数,一切都会好起来的。
我尽我所能来解决这个问题,但没有成功。所以我希望你能帮助我,thx.
您应该检查您的 Unity 布局。如果您的布局组具有内容大小调整器组件,并且子对象也有它(内容大小调整器),这可能会导致这些故障。
我使用标志(或触发器)解决了这个问题。就像这样:
// set value true to trigger ChangeSkin() in Update(),
// instead of invoke ChangeSkin() directly
private bool _changingSkinTrigger = false;
void ChangeSkin()
{
if (_currentPrefab == PREFAB_DEFAULT)
{
_currentPrefab = PREFAB_PRINCESS;
}
else
{
_currentPrefab = PREFAB_DEFAULT;
}
_changingSkinTrigger = true;
}
void Update()
{
if (_changingSkinTrigger)
{
_changingSkinTrigger = false;
ShowSkin();
}
}
private void ShowSkin()
{
foreach (var item in _defaultDressList)
{
item.SetActive(_currentPrefab == PREFAB_DEFAULT);
}
foreach (var item in _princessDressList)
{
item.SetActive(_currentPrefab == PREFAB_PRINCESS);
}
}
感谢@AndriyMarshalek 启发我。
我有一个项目使用 Android 来显示 Unity Player。所以我将 Untiy 项目导出为 Android 模块,由 Android 应用程序实现。
我在 Android Activity 中创建按钮,其中包含 UnityPlayer,当我单击按钮时,它会向 Unity Player 发送一条消息以调用 C# 函数,就像这样:
findViewById(R.id.btnChange).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUnityPlayer.UnitySendMessage("ScriptHolder", "ChangeSkin", "");
}
});
而名为“ChangeSkin”的函数只是改变一些GameObjects的活动。就像这样:
void ChangeSkin()
{
int prefab;
if (_currentPrefab == PREFAB_DEFAULT)
{
prefab = PREFAB_PRINCESS;
}
else
{
prefab = PREFAB_DEFAULT;
}
ShowSkin(prefab);
}
private void ShowSkin(int prefab)
{
_currentPrefab = prefab;
foreach (var item in _defaultDressList)
{
item.SetActive(prefab == PREFAB_DEFAULT);
}
foreach (var item in _princessDressList)
{
item.SetActive(prefab == PREFAB_PRINCESS);
}
}
还有一些奇怪的事情发生了:当我在Unity中点击按钮改变人物的布料时,调用SetActive(true)
的GameObjects显示在一帧正确位置上方的位置并变得正常,看起来他们闪光。这是项目演示的gif:
看起来位置偏移等于状态栏的高度。如果我在 Unity Scene 上创建一个按钮并调用“ChangeSkin”函数,一切都会好起来的。
我尽我所能来解决这个问题,但没有成功。所以我希望你能帮助我,thx.
您应该检查您的 Unity 布局。如果您的布局组具有内容大小调整器组件,并且子对象也有它(内容大小调整器),这可能会导致这些故障。
我使用标志(或触发器)解决了这个问题。就像这样:
// set value true to trigger ChangeSkin() in Update(),
// instead of invoke ChangeSkin() directly
private bool _changingSkinTrigger = false;
void ChangeSkin()
{
if (_currentPrefab == PREFAB_DEFAULT)
{
_currentPrefab = PREFAB_PRINCESS;
}
else
{
_currentPrefab = PREFAB_DEFAULT;
}
_changingSkinTrigger = true;
}
void Update()
{
if (_changingSkinTrigger)
{
_changingSkinTrigger = false;
ShowSkin();
}
}
private void ShowSkin()
{
foreach (var item in _defaultDressList)
{
item.SetActive(_currentPrefab == PREFAB_DEFAULT);
}
foreach (var item in _princessDressList)
{
item.SetActive(_currentPrefab == PREFAB_PRINCESS);
}
}
感谢@AndriyMarshalek 启发我。