2016-04-04 14 views
0

Ich arbeite am RTS-basierten Spiel für Handys. Ich möchte die Kamera wie "Clash of Clan" steuern, ich habe ein Tutorial und ein Skript von Savalish auf Youtube gefunden. Aber das war für 2D-Spiel. Ich möchte dieses Ergebnis in 3D, also habe ich es geändert. Alles funktioniert einwandfrei, außer dass die Kamera sich in Richtung der y-Achse nach oben bewegt. Ich will das nicht. und auch Grenzen für die Begrenzung der Kamera, um sich weiter zu bewegen. Unten ist der Code, den ich verwendet habe:So verschieben Sie die Kamera nur in der x-z-Achse RTS touch für mobile Geräte?

using UnityEngine; 
using System.Collections; 



    public class TouchCameraControl : MonoBehaviour 
    { 

    public float moveSensitivityX = 1.0f; 
     public float moveSensitivityY = 1.0f; 
     public bool updateZoomSensitivity = true; 
     public float orthoZoomSpeed = 0.05f; 
     public float minZoom = 1.0f; 
     public float maxZoom = 20.0f; 
     public bool invertMoveX = false; 
     public bool invertMoveY = false; 
     public float mapWidth = 60.0f; 
     public float mapHeight = 40.0f; 

     public float inertiaDuration = 1.0f; 

     private Camera _camera; 

     private float minX, maxX, minY, maxY; 
     private float horizontalExtent, verticalExtent; 

     private float scrollVelocity = 0.0f; 
     private float timeTouchPhaseEnded; 
     private Vector3 scrollDirection = Vector3.zero; 

     void Start() 
     { 
      _camera = Camera.main; 

      maxZoom = 0.5f * (mapWidth/_camera.aspect); 

      if (mapWidth > mapHeight) 
       maxZoom = 0.5f * mapHeight; 

      if (_camera.fieldOfView > maxZoom) 
       _camera.fieldOfView = maxZoom; 

      CalculateLevelBounds(); 
     } 

     void Update() 
     { 
      if (updateZoomSensitivity) 
      { 
       moveSensitivityX = _camera.fieldOfView/5.0f; 
       moveSensitivityY = _camera.fieldOfView/5.0f; 
      } 

      Touch[] touches = Input.touches; 

      if (touches.Length < 1) 
      { 
       //if the camera is currently scrolling 
       if (scrollVelocity != 0.0f) 
       { 
        //slow down over time 
        float t = (Time.time - timeTouchPhaseEnded)/inertiaDuration; 
        float frameVelocity = Mathf.Lerp (scrollVelocity, 0.0f, t); 
        _camera.transform.position += -(Vector3)scrollDirection.normalized * (frameVelocity * 0.05f) * Time.deltaTime; 

        if (t >= 1.0f) 
         scrollVelocity = 0.0f; 
       } 
      } 

      if (touches.Length > 0) 
      { 
       //Single touch (move) 
       if (touches.Length == 1) 
       { 
        if (touches[0].phase == TouchPhase.Began) 
        { 
         scrollVelocity = 0.0f; 
        } 
        else if (touches[0].phase == TouchPhase.Moved) 
        { 
         Vector3 delta = touches[0].deltaPosition; 

         float positionX = delta.x * moveSensitivityX * Time.deltaTime; 
         positionX = invertMoveX ? positionX : positionX * -1; 

         float positionY = delta.y * moveSensitivityY * Time.deltaTime; 
         positionY = invertMoveY ? positionY : positionY * -1; 

         _camera.transform.position += new Vector3 (positionX, 0, positionY); 
         //_camera.transform.position += transform.TransformDirection((Vector2)((new Vector2 (positionX, positionY-positionX)))); 
         scrollDirection = touches[0].deltaPosition.normalized; 
         scrollVelocity = touches[0].deltaPosition.magnitude/touches[0].deltaTime; 


         if (scrollVelocity <= 100) 
          scrollVelocity = 0; 
        } 
        else if (touches[0].phase == TouchPhase.Ended) 
        { 
         timeTouchPhaseEnded = Time.time; 
        } 
       } 


       //Double touch (zoom) 
       if (touches.Length == 2) 
       { 
        Debug.Log ("Double Touch"); 
        Vector2 cameraViewsize = new Vector2 (_camera.pixelWidth, _camera.pixelHeight); 

        Touch touchOne = touches[0]; 
        Touch touchTwo = touches[1]; 

        Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition; 
        Vector2 touchTwoPrevPos = touchTwo.position - touchTwo.deltaPosition; 

        float prevTouchDeltaMag = (touchOnePrevPos - touchTwoPrevPos).magnitude; 
        float touchDeltaMag = (touchOne.position - touchTwo.position).magnitude; 

        float deltaMagDiff = prevTouchDeltaMag - touchDeltaMag; 

        _camera.transform.position += _camera.transform.TransformDirection ((touchOnePrevPos + touchTwoPrevPos - cameraViewsize) * _camera.fieldOfView/cameraViewsize.y); 

        _camera.fieldOfView += deltaMagDiff * orthoZoomSpeed; 
        _camera.fieldOfView = Mathf.Clamp (_camera.fieldOfView, minZoom, maxZoom) - 0.001f; 

        _camera.transform.position -= _camera.transform.TransformDirection ((touchOne.position + touchTwo.position - cameraViewsize) * _camera.fieldOfView/cameraViewsize.y); 

        CalculateLevelBounds(); 
       } 
      } 
     } 

     void CalculateLevelBounds() 
     { 
      verticalExtent = _camera.fieldOfView; 
      horizontalExtent = _camera.fieldOfView * Screen.width/Screen.height; 
      minX = horizontalExtent - mapWidth/2.0f; 
      maxX = mapWidth/2.0f - horizontalExtent; 
      minY = verticalExtent - mapHeight/2.0f; 
      maxY = mapHeight/2.0f - verticalExtent; 
     } 

     void LateUpdate() 
     { 
      //Vector3 limitedCameraPosition = _camera.transform.position; 
      //limitedCameraPosition.x = Mathf.Clamp (limitedCameraPosition.x, minX, maxX); 
      //limitedCameraPosition.y = Mathf.Clamp (limitedCameraPosition.y, minY, maxY); 
      //_camera.transform.position = limitedCameraPosition; 
     } 

     void OnDrawGizmos() 
     { 
      //Gizmos.DrawWireCube (Vector3.zero, new Vector3 (mapWidth, mapHeight, 0)); 
     } 
    } 

Sag mir bitte, was ist falsch mit dem Code. Jede Hilfe würde geschätzt.

Danke.

Antwort

0
  • Stellen Sie Ihre Kamera auf (90,0,0).

  • Ersetzen Sie die Zeile

_camera.transform.position += new Vector3 (positionX, 0, positionY);

mit

//For perspective Camera 
    _camera.transform.position += new Vector3 (positionX+positionY, 0, positionY-positionX); 

//For orthographic Camera 
_camera.transform.position += new Vector3 (positionX, 0, positionY); 

Es sollte jetzt funktionieren. Ich habe an einem leeren Projekt getestet.

0

Erhalten und Speichern des ursprünglichen Y-Achsen-Wert der Kamera in der Start() Funktion, die sie dann mit der Kamera-y-Achse jeweils vor jedem Code ändern, die die Position der Kamera wie modifiziert:

_camera.transform.position= oder -= oder +=

Variable erstellen Kamera Y-Position

float yCamPos; 

to Store Init den yCamPos in der Funktion Start()

yCamPos = _camera.transform.position.y; 

der Kamera Y-Achsen-Überschreibung:

.Mit _camera.transform.position += new Vector3(positionX, 0, positionY); in Ihrer Funktion Update()

_camera.transform.position += new Vector3(positionX, yCamPos, positionY); 

.Change _camera.transform.position += _camera.transform.TransformDirection((touchOnePrevPos + touchTwoPrevPos - cameraViewsize) * _camera.fieldOfView/cameraViewsize.y);

zu

Vector3 tempVector1 = (touchOnePrevPos + touchTwoPrevPos - cameraViewsize) * _camera.fieldOfView/cameraViewsize.y; 
tempVector1.y = yCamPos; //Overwrite the y axis 
_camera.transform.position +=_camera.transform.TransformDirection(tempVector1); 

.Mit _camera.transform.position -= _camera.transform.TransformDirection((touchOne.position + touchTwo.position - cameraViewsize) * _camera.fieldOfView/cameraViewsize.y);

zu

Vector3 tempVector2 = (touchOne.position + touchTwo.position - cameraViewsize) * _camera.fieldOfView/cameraViewsize.y; 
tempVector2.y = yCamPos; //Overwrite the y axis 
_camera.transform.position -= _camera.transform.TransformDirection(tempVector2); 

Überschreiben der scrollDirection Y-Achse:

.Mit

_camera.transform.position += -(Vector3)scrollDirection.normalized * (frameVelocity * 0.05f) * Time.deltaTime; 

zu

Vector3 sDir1 = (Vector3)scrollDirection.normalized * (frameVelocity * 0.05f) * Time.deltaTime; 
sDir1.y = yCamPos; //Overwrite the y axis 
_camera.transform.position += -sDir1; 

Der gesamte Code:

public class TouchCameraControl : MonoBehaviour 
{ 

    public float moveSensitivityX = 1.0f; 
    public float moveSensitivityY = 1.0f; 
    public bool updateZoomSensitivity = true; 
    public float orthoZoomSpeed = 0.05f; 
    public float minZoom = 1.0f; 
    public float maxZoom = 20.0f; 
    public bool invertMoveX = false; 
    public bool invertMoveY = false; 
    public float mapWidth = 60.0f; 
    public float mapHeight = 40.0f; 

    public float inertiaDuration = 1.0f; 

    private Camera _camera; 

    private float minX, maxX, minY, maxY; 
    private float horizontalExtent, verticalExtent; 

    private float scrollVelocity = 0.0f; 
    private float timeTouchPhaseEnded; 
    private Vector3 scrollDirection = Vector3.zero; 

    //Get Original Camera Y Position 
    float yCamPos = 0f; 

    void Start() 
    { 
     _camera = Camera.main; 

     //Init the yCamPos 
     yCamPos = _camera.transform.position.y; 


     maxZoom = 0.5f * (mapWidth/_camera.aspect); 

     if (mapWidth > mapHeight) 
      maxZoom = 0.5f * mapHeight; 

     if (_camera.fieldOfView > maxZoom) 
      _camera.fieldOfView = maxZoom; 

     CalculateLevelBounds(); 
    } 

    void Update() 
    { 
     if (updateZoomSensitivity) 
     { 
      moveSensitivityX = _camera.fieldOfView/5.0f; 
      moveSensitivityY = _camera.fieldOfView/5.0f; 
     } 

     Touch[] touches = Input.touches; 

     if (touches.Length < 1) 
     { 
      //if the camera is currently scrolling 
      if (scrollVelocity != 0.0f) 
      { 
       //slow down over time 
       float t = (Time.time - timeTouchPhaseEnded)/inertiaDuration; 
       float frameVelocity = Mathf.Lerp(scrollVelocity, 0.0f, t); 

       Vector3 sDir1 = (Vector3)scrollDirection.normalized * (frameVelocity * 0.05f) * Time.deltaTime; 
       sDir1.y = yCamPos; //Overwrite the y axis 
       _camera.transform.position += -sDir1; 

       if (t >= 1.0f) 
        scrollVelocity = 0.0f; 
      } 
     } 

     if (touches.Length > 0) 
     { 
      //Single touch (move) 
      if (touches.Length == 1) 
      { 
       if (touches[0].phase == TouchPhase.Began) 
       { 
        scrollVelocity = 0.0f; 
       } 
       else if (touches[0].phase == TouchPhase.Moved) 
       { 
        Vector3 delta = touches[0].deltaPosition; 

        float positionX = delta.x * moveSensitivityX * Time.deltaTime; 
        positionX = invertMoveX ? positionX : positionX * -1; 

        float positionY = delta.y * moveSensitivityY * Time.deltaTime; 
        positionY = invertMoveY ? positionY : positionY * -1; 

        //Overwrite the y axis 
        _camera.transform.position += new Vector3(positionX, yCamPos, positionY); 


        //_camera.transform.position += transform.TransformDirection((Vector2)((new Vector2 (positionX, positionY-positionX)))); 
        scrollDirection = touches[0].deltaPosition.normalized; 
        scrollVelocity = touches[0].deltaPosition.magnitude/touches[0].deltaTime; 


        if (scrollVelocity <= 100) 
         scrollVelocity = 0; 
       } 
       else if (touches[0].phase == TouchPhase.Ended) 
       { 
        timeTouchPhaseEnded = Time.time; 
       } 
      } 


      //Double touch (zoom) 
      if (touches.Length == 2) 
      { 
       Debug.Log("Double Touch"); 
       Vector2 cameraViewsize = new Vector2(_camera.pixelWidth, _camera.pixelHeight); 

       Touch touchOne = touches[0]; 
       Touch touchTwo = touches[1]; 

       Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition; 
       Vector2 touchTwoPrevPos = touchTwo.position - touchTwo.deltaPosition; 

       float prevTouchDeltaMag = (touchOnePrevPos - touchTwoPrevPos).magnitude; 
       float touchDeltaMag = (touchOne.position - touchTwo.position).magnitude; 

       float deltaMagDiff = prevTouchDeltaMag - touchDeltaMag; 

       Vector3 tempVector1 = (touchOnePrevPos + touchTwoPrevPos - cameraViewsize) * _camera.fieldOfView/cameraViewsize.y; 
       tempVector1.y = yCamPos; //Overwrite the y axis 
       _camera.transform.position += _camera.transform.TransformDirection(tempVector1); 

       _camera.fieldOfView += deltaMagDiff * orthoZoomSpeed; 
       _camera.fieldOfView = Mathf.Clamp(_camera.fieldOfView, minZoom, maxZoom) - 0.001f; 

       Vector3 tempVector2 = (touchOne.position + touchTwo.position - cameraViewsize) * _camera.fieldOfView/cameraViewsize.y; 
       tempVector2.y = yCamPos; //Overwrite the y axis 
       _camera.transform.position -= _camera.transform.TransformDirection(tempVector2); 

       CalculateLevelBounds(); 
      } 
     } 
    } 

    void CalculateLevelBounds() 
    { 
     verticalExtent = _camera.fieldOfView; 
     horizontalExtent = _camera.fieldOfView * Screen.width/Screen.height; 
     minX = horizontalExtent - mapWidth/2.0f; 
     maxX = mapWidth/2.0f - horizontalExtent; 
     minY = verticalExtent - mapHeight/2.0f; 
     maxY = mapHeight/2.0f - verticalExtent; 
    } 

    void LateUpdate() 
    { 
     //Vector3 limitedCameraPosition = _camera.transform.position; 
     //limitedCameraPosition.x = Mathf.Clamp (limitedCameraPosition.x, minX, maxX); 
     //limitedCameraPosition.y = Mathf.Clamp (limitedCameraPosition.y, minY, maxY); 
     //_camera.transform.position = limitedCameraPosition; 
    } 

    void OnDrawGizmos() 
    { 
     //Gizmos.DrawWireCube (Vector3.zero, new Vector3 (mapWidth, mapHeight, 0)); 
    } 
} 

-Code wurde nicht geprüft, weil ich nicht über die Grafikdateien, aber es wird erwartet, arbeiten....

+0

Ich schätze Ihre Hilfe sehr. Ich habe die Logik verstanden, die du erklärt hast. Die Erklärung ist sehr hilfreich. Aber irgendwie funktioniert es nicht. Die Y-Achse wird zu stark vergrößert, wenn ich zum Verschieben blättern muss. – Saad