【问题标题】:How can I assign a material to a gameobject when selecting it and change it back to the original material when deselecting the gameobject using C#?如何在选择游戏对象时将材质分配给游戏对象,并在使用 C# 取消选择游戏对象时将其更改回原始材质?
【发布时间】:2019-02-21 00:32:02
【问题描述】:

我在场景中有多个游戏对象,上面有不同的材质。当我选择一个游戏对象时,它的材质必须更改为 selectMat。我的代码在编辑器中工作,在我的三星 s8 上也可以工作,但在多次选择不同的游戏对象后,selectedMat 材质仍保留在游戏对象上,并且不会变回原来的Mat。

我真的可以在这方面寻求帮助。

{
public GameObject SelectedObject;
public Material SelectMat;
public string Path = "StringPath";
private Material originalMat;

// Start is called before the first frame update
void Start()
{
    originalMat = Resources.Load<Material>(Path);

}

public void Update()
{

    if (Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast(ray, out hit))
        {
            GameObject hitObject = hit.transform.gameObject;
            hitObject.GetComponent<Renderer>().material = originalMat;
            SelectObject(hitObject);
            hitObject.GetComponent<Renderer>().material = SelectMat;

        }
        else
        {
            ClearSelection();
        }
    }
}
void SelectObject(GameObject obj)
{
    if (SelectedObject != null)
    {
        if (obj == SelectedObject)
        {
            return;
        }
        SelectedObject = obj;
    }
}

void ClearSelection()
{
    if (SelectedObject == null)
    {
        return;
    }
    else
    {
        SelectedObject.GetComponent<Renderer>().sharedMaterial = originalMat;
        SelectedObject = null;
    }
}

【问题讨论】:

  • 您在清除选择时使用了sharedMaterial。但是,当您选择它时,您使用了material,这很可能是导致问题的原因。

标签: c# unity3d


【解决方案1】:

更改material 后,Renderer 使用该材质的本地实例。在 afaik 之后更改 sharedMaterial 没有任何效果。

使用

SelectedObject.GetComponent<Renderer>().material = originalMat;

改为

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 2022-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多