0

我的场景中有两个 3d 按钮,当我注视任何按钮时,它将调用 OnPointerEnter 回调并保存指针注视的对象。

在 Gamepad 上按下 Fire1 后,我应用从 Resources 文件夹中获取的材料。当我凝视第二个按钮时,我的问题就开始了,按下 Fire1 按钮会尴尬地同时更改两个按钮。

这是我附加到两个按钮的脚本

using UnityEngine;
using UnityEngine.EventSystems;
using Vuforia;
using System.Collections;

public class TriggerMethods : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
Material _mat;
GameObject targetObject;
Renderer rend;   
int i = 0;  

// Update is called once per frame
void Update () {
    if (Input.GetButtonDown("Fire1"))
        TukarMat();
}

public void OnPointerEnter(PointerEventData eventData)
{        
    targetObject = ExecuteEvents.GetEventHandler<IPointerEnterHandler>(eventData.pointerEnter);       
}

public void OnPointerExit(PointerEventData eventData)
{
    targetObject = null;
}    

public void TukarMat()
{

    Debug.Log("Value i = " + i);

    if (i == 0)
    {
        ApplyTexture(i);
        i++;
    }
    else if (i == 1)
    {
        ApplyTexture(i);
        i++;
    }
    else if (i == 2)
    {
        ApplyTexture(i);
        i = 0;
    }
}

void ApplyTexture(int i)
{
    rend = targetObject.GetComponent<Renderer>();
    rend.enabled = true;
    switch (i)
    {
        case 0:                
            _mat = Resources.Load("Balut", typeof(Material)) as Material;
            rend.sharedMaterial = _mat;
            break;
        case 1:
            _mat = Resources.Load("Khasiat", typeof(Material)) as Material;
            rend.sharedMaterial = _mat;
            break;
        case 2:
            _mat = Resources.Load("Alma", typeof(Material)) as Material;
            rend.sharedMaterial = _mat;
            break;
        default:
            break;
    }
}

我感觉到一些逻辑错误,并尝试创建另一个类来仅管理指针注视的对象,但我变得更加困惑。

希望得到一些帮助

谢谢

4

1 回答 1

0

当您按下 Fire1 时,两个按钮上都会调用 TukarMat()。如果 targetObject 真的变成 null 这应该在第一个按钮上给出错误,因为它试图从 null 对象获取组件。否则,它会像你说的那样改变。确保 OnPointerExit 被调用。

此外,您似乎正在更改共享材料。文档建议:

修改 sharedMaterial 将改变所有使用此材质的对象的外观,并更改存储在项目中的材质设置。

不建议修改 sharedMaterial 返回的材质。如果要修改渲染器的材质,请改用材质。

因此,请尝试更改材质属性而不是 sharedMaterial,因为它只会更改该对象的材质。

于 2016-07-15T06:34:38.670 回答