2D游戏透视相机

时间:2015-12-06 17:30:52

标签: unity3d

我已将相机更改为透视图以使其具有“3D”外观,但这样做时,我的鼠标点击就会到处都是。

有人可以帮忙吗?

          if (Input.GetMouseButtonDown(0)) {
             Vector2 point = controlCamera.ScreenPointToRay(Input.mousePosition).origin;
             hit = Physics2D.Raycast(point, Vector2.zero);
             if (!hit.transform) return;
             pressedChip = hit.transform.GetComponent<Chip>();
             pressPoint = Input.mousePosition; 
         }
         if (Input.GetMouseButton(0) && pressedChip != null) {
             Vector2 move = Input.mousePosition;
             move -= pressPoint;
             if (move.magnitude > Screen.height * 0.05f) {
                 foreach (Side side in Utils.straightSides)
                     if (Vector2.Angle(move, Utils.SideOffsetX(side) * Vector2.right + Utils.SideOffsetY(side) * Vector2.up) <= 45)
                         pressedChip.Swap(side);
                 pressedChip = null;
             }
         }

    public Chip GetChipFromTouch() {
    Vector2 point;
    if (isMobilePlatform) {
        if (Input.touchCount == 0) return null;
        point = controlCamera.ScreenPointToRay(Input.GetTouch(0).position).origin;
    } else 
        point = controlCamera.ScreenPointToRay(Input.mousePosition).origin;

    hit = Physics2D.Raycast(point, Vector2.zero);
    if (!hit.transform) return null;
    return hit.transform.GetComponent<Chip>();
}

编辑: 我已经更新了脚本以添加Vector3引用。另外,我现在已经添加了一个盒式对撞机来代替2D对撞机。

            if (Input.GetMouseButtonDown(0)) {

            Vector3 position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            float range = 0f;
            RaycastHit hit;

            Ray ray =  controlCamera.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray.origin, ray.direction)){
                Debug.Log ("New Script");
                if(Physics.Raycast(ray, out hit, range))
                {
                    pressedChip = hit.transform.GetComponent<Chip>();
                    Debug.Log (pressedChip);
                }
                Debug.Log (pressedChip);
                //  hit.transform.GetComponent<Chip>();
                            pressPoint = Input.mousePosition; 
            }

//          Vector2 point = controlCamera.ScreenPointToRay(Input.mousePosition).origin;
//          hit = Physics2D.Raycast(point, Vector2.zero);
//          if (!hit.transform) return;
//          pressedChip = hit.transform.GetComponent<Chip>();
//          pressPoint = Input.mousePosition; 
        }
        if (Input.GetMouseButton(0) && pressedChip != null) {
            Vector3 move = Camera.main.ScreenToWorldPoint(Input.mousePosition);

//          Vector2 move = Input.mousePosition;
//          move -= pressPoint;
            if (move.magnitude > Screen.height * 0.05f) {
                foreach (Side side in Utils.straightSides)
                    if (Vector2.Angle(move, Utils.SideOffsetX(side) * Vector2.right + Utils.SideOffsetY(side) * Vector2.up) <= 45)
                        pressedChip.Swap(side);
                pressedChip = null;
            }
        }

1 个答案:

答案 0 :(得分:0)

您似乎误解了raycast,raycast2D和鼠标输入的概念。

您的鼠标输入被视为屏幕位置,即2D,其值仅限于屏幕(或窗口)的分辨率。例如,如果您的屏幕是600x480,则x的位置将介于0和599之间,y的位置介于0和479之间。

如果要在场景中使用鼠标输入,则需要将其转换为场景中的3D位置。您可以使用:

Vector3 position = Camera.main.ScreenToWorldPoint(Input.mousePosition);

这将给出几乎相机位置的值。在您的情况下,您希望使用一条光线,该光线是鼠标位置及其转换为世界位置的结果:

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

此时,您会在相机旋转方向上从相机位置开始射线。那是因为你有一个正交相机(使用透视,光线会认为FOV朝着正确的方向前进)。

您的误解是您使用

Physics2D.Raycast();

这是为了执行2D光线投射。你的光线是3D的,所以不会这样做。

if (Input.GetMouseButtonDown(0)) {
    Ray ray =  controlCamera.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray.origin, ray.direction)){

    }
}

现在的问题是2D和3D引擎在Unity中完全分开。而根本没有沟通。因此,对于你的光线投射来点什么,它必须是3D对撞机。例如,如果你使用精灵,你不能指望BoxCollider2D在光线投射上返回命中。

解决方案是将一个空的游戏对象作为一个孩子附加并附加一个BoxCollider并给它适当的大小。