Unity C#相机缩放脚本

时间:2013-04-14 19:23:07

标签: c# unity3d

所以在我解释我的问题之前。我先说出我到底在做什么。 我正在点击移动/缩放相机脚本。主摄像头前有3架飞机。现在我正在做的是,创建一个脚本,上面写着“相机将放大被点击的平面。我做了几次尝试来制作一个工作脚本,但是效果不好。每次遇到新的bug ,错误和什么没有。:| 我感到沮丧并删除了错误的脚本。现在我想从头开始。我是用C#

做的

由于我不是专业人士,任何人都可以详细解释我完成它吗? 我很困惑如何处理我放置的飞机。我想知道我的脚本中缺少什么。 这是我如何放置这些飞机的屏幕截图。

enter image description here

编辑。 - 我设法搞定了。现在我需要建议,如何定位我放在相机前面的飞机。

using UnityEngine;
using System.Collections;

public class CameraZoom : MonoBehaviour
{
    public int zoomLevelSelected = 0;
    public float[] ZoomLevels = new float[] { 60, 40, 20 };
    void Update()
    {
        int zoomChange = 0;
        if (Input.GetMouseButtonDown(0)) { zoomChange = +1; } // back
        else if (Input.GetMouseButtonDown(1)) { zoomChange = -1; } // forward
        if (zoomChange != 0)
        {
            zoomLevelSelected = Mathf.Clamp(zoomLevelSelected + zoomChange, 0, ZoomLevels.Length - 1);
            camera.fieldOfView = ZoomLevels[zoomLevelSelected];
        }
    }
}

2 个答案:

答案 0 :(得分:1)

哎呀,这是创建点击缩放的一种方法。要点是通过鼠标光标从摄像机创建到场景的光线。当该光线与物体相交时,从交叉点沿交叉面的法线向后创建第二条光线。

void Update () {
    if(Input.GetMouseButtonDown(0)){
        // get ray from camera in to scene at the mouse position
        Ray ray = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        // hardcoded "zoom" distance.
        float zoomDist = 15.0f;

        // Raycast from camera to mouse cursor, if object hit, zoom.
        if (Physics.Raycast(ray,out hit,Mathf.Infinity)){       
            // Create a second ray from the hit object back out, zoom the camera along this ray.
            Ray r = new Ray(hit.point,hit.normal);
            Camera.mainCamera.transform.position = r.GetPoint(zoomDist);
        }
    }
}

要记住的事情:

    如上所述,
  1. Physics.Raycast将对任何带碰撞器的GameObject返回true。如果您只想在选择特定的游戏对象时进行缩放,请使用layers
  2. 相机不会直接以您单击的GameObject为中心。我使用精确的交点来创建相机将放大的位置。
  3. zoomDist是距离物体的距离。
  4. 此代码仅适用于透视相机,如果使用拼图,则需要修改相机的size值以进行缩放。

答案 1 :(得分:0)

你的脚本的问题是你的var int zoomChange每帧被设置为零,所以将该变量移动到类级别。

using UnityEngine;
using System.Collections;

public class CameraZoom : MonoBehaviour
{
    public int zoomLevelSelected = 0;
    public float[] ZoomLevels = new float[] { 60, 40, 20 };
    int zoomChange = 0;  //<<<<<<<<<<<<<

    void Update()
    {
        if (Input.GetMouseButtonDown(0)) { zoomChange = +1; } // back
        else if (Input.GetMouseButtonDown(1)) { zoomChange = -1; } // forward
        if (zoomChange != 0)
        {
            zoomLevelSelected = Mathf.Clamp(zoomLevelSelected + zoomChange, 0, ZoomLevels.Length - 1);
            camera.fieldOfView = ZoomLevels[zoomLevelSelected];
        }
    }
}