在鼠标位置实例化对象

时间:2017-04-15 08:54:56

标签: c# unity3d

我已经创建了一个脚本,该脚本应该根据鼠标位置实例化gameobject,但是出了问题。它只是在屏幕的一个位置和中间进行实例化。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LineInstantiater : MonoBehaviour {

    public GameObject lineprefab;
    private GameObject linehandler;
    private Vector3 mousepos;

    void Update(){
        if (Input.GetMouseButton (0)) {
            mousepos = Camera.main.ScreenToWorldPoint (Input.mousePosition);
            linehandler = Instantiate (lineprefab,Camera.main.ScreenToWorldPoint(Input.mousePosition),Quaternion.identity) as GameObject ;
            linehandler.transform.position = mousepos;
        }
    }

}

请告诉我我的剧本有什么问题。

1 个答案:

答案 0 :(得分:4)

问题是Input.mousePosition没有z轴,因为鼠标坐标只有x和y轴。 z轴只是0,因此在使用Camera.main.ScreenToWorldPoint时会返回错误的位置。

您需要执行Input.mousePosition;,手动修改它的z轴值为> 0。通常情况下,10对此很好,但如果对您来说不够,可以修改它。之后,您可以将修改后的Vector3传递给Camera.main.ScreenToWorldPoint(mousepos)函数。

public GameObject lineprefab;
private GameObject linehandler;
private Vector3 mousepos;

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        mousepos = Input.mousePosition;
        mousepos.z = 10;

        mousepos = Camera.main.ScreenToWorldPoint(mousepos);
        linehandler = Instantiate(lineprefab, mousepos, Quaternion.identity) as GameObject;
    }
}

public GameObject lineprefab;
private GameObject linehandler;

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        Ray rayCast = Camera.main.ScreenPointToRay(Input.mousePosition);
        linehandler = Instantiate(lineprefab, rayCast.GetPoint(10), Quaternion.identity) as GameObject;
    }
}

不相关:

我注意到您正在使用Input.GetMouseButton。您可能需要Input.GetMouseButtonDown,因为Input.GetMouseButtonDown被调用一次,直到密钥被释放。按住按键时会反复调用Input.GetMouseButton,您可以轻松地创建数千个对象。