OnMouseOver() 和 OnMouseExit()

OnMouseOver() and OnMouseExit()

提问人:Rory L. 提问时间:2/5/2018 最后编辑:Brien FossRory L. 更新时间:2/5/2018 访问量:1108

问:

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

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

我制作了一种新材料并将其应用于该位置,然后将其变成预制件,以取代创建飞机时设置的标准材料。

我已经开始尝试使用鼠标位置将颜色变化应用于当前鼠标位置的平面,但我不完全了解如何具体分辨特定位置的位置。Physics.CheckSpheregameObject

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# unity-游戏引擎

评论


答:

0赞 Brien Foss 2/5/2018 #1

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

enter image description here

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

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

评论

0赞 Rory L. 2/5/2018
我想我并不完全理解这个想法。我将标签应用于预制件。这是我尝试过的代码,但没有任何反应。public virtual void OnTriggerEnter(Collider other) { if (other.gameObject.tag == “GroundTile”) { groundTileMeshRenderer.material.color = isTargeted; } else { groundTileMeshRenderer.material.color = notTargeted;不管我的问题的答案如何,我仍然很好奇为什么 OnMouseOver() 会影响大块游戏对象,即使鼠标没有触摸它们。
0赞 Brien Foss 2/5/2018
我认为这是因为实际上没有发生“碰撞”。我的例子就是如何使用标签。我会做一些研究,然后回到这个。
0赞 Brien Foss 2/5/2018
同时看看这里,我必须离开:answers.unity.com/questions/547513/......
1赞 Rory L. 2/5/2018 #2

因此,多亏了Unity论坛,我才知道答案是什么。我的错误出在实例化转换脚本中。因为我使用的是平面原始 3d 对象,所以我没有正确计算平面的大小。例如,以下用于实例化每行的代码片段删除了由于平面太大而无法简单地放置在 、 等处而发生的重叠。(0,0,0)(0,0,1)(0,0,2)

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

评论

0赞 Brien Foss 2/6/2018
这是个好消息,很高兴你找到了它。将您的答案标记为已接受,以便其他人将来可以使用此问答来获取价值。