2013-04-14 2 views
0

Итак, прежде чем я объясню свою проблему. Сначала я расскажу, что я действительно делаю. Я работаю над щелчком мыши для перемещения/масштабирования сценария камеры. Перед моей главной камерой стоят 3 самолета. Теперь я делаю это, создавая сценарий, в котором говорится: «Камера будет увеличивать плоскость, на которую нажимают. Я сделал несколько попыток придумать рабочий скрипт, но это не сработало. Каждый раз, когда я сталкиваюсь с новыми ошибками , ошибки, а что нет.: | Я расстроился и удалил багги-скрипт. Теперь я хочу начать с нуля. Я делаю это в C#Unity 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]; 
     } 
    } 
} 
+0

Пару вещей. Чтобы выбрать самолеты, используйте [Physics.Raycast] (http://docs.unity3d.com/Documentation/ScriptReference/Physics.Raycast.html) (Документы должны объяснить основы). Затем не изменяйте поле обзора для увеличения, это испортит ваше представление. Вместо этого переместите преобразование вашей камеры. – Jerdak

ответ

1

Heck with it, here to one one one one one to one click to click to zoom. Суть в том, что вы создаете луч с камеры на сцену с помощью курсора мыши. Когда этот луч пересекает объект, создайте второй луч с точки пересечения назад вдоль нормали пересекающегося лица.

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 с коллайдером. Используйте layers, если вы хотите увеличить масштаб при выборе определенных GameObjects.
  2. Камера не будет непосредственно центрировать на GameObject, который вы нажимаете. Я использую точную точку пересечения, чтобы создать положение, в котором камера будет приближаться.
  3. zoomDist - расстояние от объекта.
  4. Этот код работает только с перспективными камерами, если вы используете орфографию, вам нужно будет изменить значение камеры size для увеличения.
+0

Благодарим вас за помощь. :) – ChE

+0

Я также рекомендовал бы библиотеку iTween, если вы хотите гладкое движение камеры. Это будет что-то вроде iTween.MoveTo (Camera.mainCamera.gameObject, r.GetPoint (zoomDist)); –

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]; 
     } 
    } 
} 
Смежные вопросы