【问题标题】:OnMouseOver() and OnMouseExit()OnMouseOver() 和 OnMouseExit()
【发布时间】:2018-02-05 09:39:30
【问题描述】:

我正在尝试实例化一些平面以用作我的地形,并给它们OnMouseOver() 将它们更改为某种颜色,并给它们OnMouseExit() 将它们更改回原始颜色。

我将一个平面实例化脚本附加到主摄像机以生成平面预制件,并将鼠标事件脚本附加到平面prefab。我将它们全部实例化并将事件传递给它们,但在游戏中,鼠标事件被应用于长条平面、整个象限或不在鼠标光标位置的随机单个平面。

我制作了一种新材质并将其应用到该位置,然后将其变成预制件,以替换创建平面时设置的标准材质。

我已经开始尝试使用鼠标位置将颜色更改应用到具有Physics.CheckSphere 的当前鼠标位置的平面,但我不完全明白如何具体说明gameObject 在特定位置是什么.

public class TerrainGeneration : MonoBehaviour {

    [SerializeField]
    private Transform groundTile;
    private Vector3 row;
    private int max = 10;

    // Use this for initialization
    void Start () {

        for ( int i = 0; i <= max; i++)
        {
            for (int x = 0; x <= max; x++) {

                row = new Vector3(i, 0, x);
                Instantiate(groundTile, row, Quaternion.identity);

            }    
        }
    }
}


public class MouseEvents : MonoBehaviour {

    private Color isTargeted;
    private Color notTargeted;
    private MeshRenderer groundTileMeshRenderer;
    private Vector3 mousePosition;
    private float mouseX;
    private float mouseY;

    void Start () {

        groundTileMeshRenderer = gameObject.GetComponent<MeshRenderer>();
        isTargeted = Color.cyan;
        notTargeted = groundTileMeshRenderer.material.color;

    }

    void Update()
    {
        mouseX = Mathf.RoundToInt(Input.GetAxis("Mouse X"));
        mouseY = Mathf.RoundToInt(Input.GetAxis("Mouse Y"));
        mousePosition = new Vector3(mouseX, 0, mouseY);

        if (Physics.CheckSphere(mousePosition, 1))
        {
            **//Get the specific gameObject located at the current mouse position
            //Set the gameObject as the target for the color change**
        }
    }

    void OnMouseOver()
    {
        groundTileMeshRenderer.material.color = isTargeted;
    }

    void OnMouseExit()
    {
        groundTileMeshRenderer.material.color = notTargeted;
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    所以,感谢 Unity 论坛,我找到了答案。我的错误出现在实例化转换脚本中。因为我使用的是平面原始 3d 对象,所以我没有正确考虑平面的大小。以下代码 sn-p 用于实例化每一行,消除了重叠,因为平面太大而无法简单地放置在 (0,0,0)(0,0,1)(0,0,2) 上。

    row = new Vector3(i * 10, 0, x * 10);
    Instantiate(groundTile, row, Quaternion.identity);
    

    【讨论】:

    • 这是个好消息,很高兴你找到了。将您的答案标记为已接受,以便其他人将来可以使用此问答获取价值。
    【解决方案2】:

    tag您的游戏对象,然后您可以识别它们。

    如果你这样做了,那么你可以像这样使用它们(纯粹是举例):

    public virtual void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.tag == "planeA")
        {
            //do something
        }
    }
    

    【讨论】:

    • 我不认为我完全理解这个想法。我将标签应用于预制件。这是我尝试过的代码,没有任何反应。 public virtual void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "GroundTile") { groundTileMeshRenderer.material.color = isTargeted; } else { groundTileMeshRenderer.material.color = notTargeted;不管我的问题的答案如何,我仍然很好奇为什么 OnMouseOver() 会影响大块的游戏对象,即使鼠标没有碰到它们。
    • 我认为这是因为实际上并没有发生“碰撞”。我的例子只是如何使用标签。我会做一些研究,然后回到这个。
    • 顺便看看这里,我得走了:answers.unity.com/questions/547513/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2012-02-04
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多