How can ı rotate camera with touch?

Hi everyone ı want to rotate camera with touch.

ı tried this logic:

Function Update()
{
İf(Input.GetTouch(0).phase==TouchPhase.Began)
{
 var firstposint:Transform;
 firstpoint.position=Input.GetTouch(0).position;
 

}
if(Input.GetTouch(0).phase==TouchPhase.Stationy)
{
  var seconpoint:Transform;
  seconpoint.position=Input.GetTouch(0).position;
  this.camera.transform.rotation.x += seconpoint.position.x - firstpoint.position.x;
  this.camera.transform.rotation.y += seconpoint.position.y - firstpoint.position.y;
}
}

this isnt work! ı dont understand ı am getting to first touch position for example firstpoint=20 and while ı was touching to screen ı am getting position of second touch for example seconpoint=40

and ı am setting to them differences to rotation of camera!
where ı am wrong? pls help me!

How is your script even building? on line 10: if(Input.GetTouch(0).phase==TouchPhase.Stationy) "Stationy" isn't a enum member of [TouchPhase][1], [TouchPhase.Stationary][2] would be the correct enum that you're looking for to begin with. [1]: http://docs.unity3d.com/ScriptReference/TouchPhase.html [2]: http://docs.unity3d.com/ScriptReference/TouchPhase.Stationary.html

7 Answers

7

Method transform.rotation is Quaternion. For more information about quaternion see docs. I correct your code:

 private var firstpoint:Vector3; //change type on Vector3
 private var secondpoint:Vector3;

 private var xAngle: float = 0.0; //angle for axes x for rotation
 private var yAngle: float = 0.0;
 private var xAngTemp: float = 0.0; //temp variable for angle
 private var yAngTemp: float = 0.0;

 function Start() {
  //Initialization our angles of camera
  xAngle = 0.0;
  yAngle = 0.0;
  this.transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0);
 }

 function Update() {
  //Check count touches
  if(Input.touchCount > 0) {
   //Touch began, save position
   if(Input.GetTouch(0).phase == TouchPhase.Began) {
    firstpoint = Input.GetTouch(0).position;
    xAngTemp = xAngle;
    yAngTemp = yAngle;
   }
   //Move finger by screen
   if(Input.GetTouch(0).phase==TouchPhase.Moved) {
    secondpoint = Input.GetTouch(0).position;
    //Mainly, about rotate camera. For example, for Screen.width rotate on 180 degree
    xAngle = xAngTemp + (secondpoint.x - firstpoint.x) * 180.0 / Screen.width;
    yAngle = yAngTemp - (secondpoint.y - firstpoint.y) *90.0 / Screen.height;
    //Rotate camera
    this.transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0);
   }
  }
 }

Attach this script at Main Camera on your scene. Of course, you may to use Touch.deltaPosition, but I write common method. I hope, that it will help you.

@zharik86 how this works. the camera rotate from some point. If the perspective camera is Orthographic, works good?.

It work's Pretty nicely just need to add your personal constraits

This code really helped me a lot! I tried a few different things and this turned out to be the right answer for my project. I did have one issue. When I rotated my camera on the y-axis until it was upside down, the x-axis was reversed. Here is my update to solve the issue. I am also clamping the values to be 0 to 360. My code is also for rotating the Player, not a camera, but that can be easily changed.

My project is written in c#. @zharik86

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


public class touchCam : MonoBehaviour {

	private Vector3 firstpoint; 
	private Vector3 secondpoint;
	private float xAngle = 0.0f; //angle for axes x for rotation
	private float yAngle = 0.0f;
	private float xAngTemp = 0.0f; //temp variable for angle
	private float yAngTemp = 0.0f;
	private GameObject playRot;


	void  Start() {
		
		dtext=GameObject.Find("debugText").GetComponent<Text>();

		firstpoint = new Vector3 (0, 0, 0);
		secondpoint = new Vector3 (0, 0, 0);

		playRot = GameObject.Find ("Player");
	
		xAngle = 0.0f; 
		yAngle = 0.0f;
   
		transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0f);
	}

	void Update() {
		//Check count touches
		if (PlayerController.instance.TabletMode == 1) {
			if (Input.touchCount > 0) {
				//Touch began, save position
				if (Input.GetTouch (0).phase == TouchPhase.Began) {
					firstpoint = Input.GetTouch (0).position;
					xAngTemp = xAngle;
					yAngTemp = yAngle;
				}
				//Move finger by screen
				if (Input.GetTouch (0).phase == TouchPhase.Moved) {
					secondpoint = Input.GetTouch (0).position;
					//Mainly, about rotate camera. For example, for Screen.width rotate on 180 degree
					yAngle = yAngTemp - (secondpoint.y - firstpoint.y) * 90.0f / Screen.height;

					if (yAngle < 0)
						yAngle  +=360;
					if (yAngle > 360)
						yAngle  -=360;

					if (yAngle > 90 && yAngle < 270)
						xAngle = xAngTemp - (secondpoint.x - firstpoint.x) * 180.0f / Screen.width;
					else
						xAngle = xAngTemp + (secondpoint.x - firstpoint.x) * 180.0f / Screen.width;

					if (xAngle < 0)
						xAngle  +=360;

					if (xAngle > 360)
						xAngle  -=360;
					
					transform.rotation = Quaternion.Euler (yAngle, xAngle, 0.0f);

				}
			}
		}
	}
}

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

public class rotate : MonoBehaviour
{

float rotSpeed =20;

void OnMouseDrag ()
{
	float rotX = Input.GetAxis("Mouse X")*rotSpeed*Mathf.DegZRad;
	float rotY = Input.GetAxis("Mouse Y")*rotSpeed*Mathf.DegZRad;

	transform.RotateAround(Vector3.up, -rotX);
	transform.RotateAround(Vector3.right, rotY);
}

}

Note is Mathf.Deg2Rad and not Mathf.degZRad;

{
Vector3 FirstPoint;
Vector3 SecondPoint;
float xAngle;
float yAngle;
float xAngleTemp;
float yAngleTemp;
public float ymax;
public float ymin;

    void Start()
    {
       

        xAngle = 0;
        yAngle = 0;
        

    }

    void Update()
    {
       
        if (Input.touchCount > 0)
        {
            bool yclamp = false;
            if (Input.GetTouch(0).phase == TouchPhase.Began)
            {
                FirstPoint = Input.GetTouch(0).position;
                xAngleTemp = xAngle;
                if(!yclamp)
                yAngleTemp = yAngle;
            }
            if (yAngle > ymax && yAngle - yAngleTemp > 0 || yAngle < ymin && yAngle - yAngleTemp < 0)
            {
                yclamp = true;

                if (Input.GetTouch(0).phase == TouchPhase.Moved)
                {
                    SecondPoint = Input.GetTouch(0).position;
                    xAngle = xAngleTemp + (SecondPoint.x - FirstPoint.x) * 180 / Screen.width;
                    // yAngle = yAngleTemp + (SecondPoint.y - FirstPoint.y) * 90 / Screen.height;
                    this.transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0f);
                }
            }
            else
            {
                if (Input.GetTouch(0).phase == TouchPhase.Moved)
                {
                    SecondPoint = Input.GetTouch(0).position;
                    xAngle = xAngleTemp + (SecondPoint.x - FirstPoint.x) * 180 / Screen.width;
                    yAngle = yAngleTemp + (SecondPoint.y - FirstPoint.y) * 90 / Screen.height;
                    this.transform.rotation = Quaternion.Euler(yAngle, xAngle, 0.0f);
                    yclamp = false;
                }


                Debug.Log(yAngle);
            }
        }

    }
   
}

@Jaskirat_Games this works smoothly for me to clamp y axis

The above code nearly solved my problem but could anybody help me to clamp the rotation in x and y axis.@zharik86 .

xAngle = Mathf.clamp(xAngle,-180f,180f); you can change the restrictions based on your requirements and can use the same code for yAngle as well by substituting xAngle with yAngle

using UnityEngine;
public class CameraRotation : MonoBehaviour
{
public float sensitivity;
public Transform body;
Vector3 firstPoint, secondPoint;
float xRotation, yRotation;
float tempXrotation, tempYrotation;
void Update ()
{
TouchControll();
Rotation();
}
public void TouchControll ()
{
if (Input.touchCount > 0)
{
if (Input.GetTouch(0).phase == TouchPhase.Began)
{
firstPoint = Input.GetTouch(0).position;
tempYrotation = yRotation;
tempXrotation = xRotation;
}
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
secondPoint = Input.GetTouch(0).position;
yRotation = (tempYrotation + (secondPoint.x - firstPoint.x)sensitivity/Screen.width);
xRotation = (tempXrotation + (secondPoint.y - firstPoint.y) * sensitivity / Screen.width);
}
if (Input.GetTouch(0).phase == TouchPhase.Ended)
{
tempYrotation = yRotation;
tempXrotation = xRotation;
}
}
}
public void Rotation ()
{
//xAngle = Mathf.Clamp(xAngle, -90f, 90f);
xRotation = Mathf.Clamp(xRotation, -90f, 90f);
body.transform.rotation = Quaternion.Euler(Vector3.up
yRotation) ;
transform.localRotation = Quaternion.Euler(-xRotation, 0f, 0f);
}
}

Here is my realization of Camera Rotation by swipe (touch). It written with new Input System support. As my project is a car game, I need only X axis. But You can easly add Y axis too.
Also this code has a filter to prevent conflicts with UI elements.

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem.EnhancedTouch;
using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch;
using TouchPhase = UnityEngine.InputSystem.TouchPhase;

public class SwipeController : MonoBehaviour
{
    private Touch activeTouch;
    private Vector3 FirstPoint;
    private Vector3 SecondPoint;

    public float swipeSpeed = 0.2f;

    public static float swipeDirX = 0;
    public static Vector3 xSwipeAmount;


    private void Start()
    {
        EnhancedTouchSupport.Enable();
        xSwipeAmount = Vector3.zero;
    }



    private bool IsPointerOverUIObject(Vector2 pos)
    {
        PointerEventData eventDataCurrentPosition = new(EventSystem.current);
        eventDataCurrentPosition.position = pos;
        List<RaycastResult> results = new();
        EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
        return results.Count > 0;
    }


    private void Update()
    {
        if (Touch.activeTouches.Count > 0)
        {
            activeTouch = Touch.activeTouches[0];

            if (IsPointerOverUIObject(activeTouch.screenPosition)) return;

            if (activeTouch.phase == TouchPhase.Began)
            {
                FirstPoint = activeTouch.screenPosition;
                swipeDirX = 0;
            }
            else if (activeTouch.phase == TouchPhase.Moved){
                SecondPoint = activeTouch.screenPosition;
                swipeDirX = SecondPoint.x - FirstPoint.x;
            }
        }
        else
        {
            swipeDirX = 0;
        }

        xSwipeAmount = swipeDirX * swipeSpeed * Time.deltaTime * Vector3.up;
    }

}

This is how that code can be used: void CamRotateFunc() { if (CameraFollow.followEnabled && SwipeController.swipeDirX != 0) { CameraFollow.followEnabled = false; uiscript.camRestoreButton.gameObject.SetActive(true); } CameraFollow.target.localEulerAngles += SwipeController.xSwipeAmount; } void Update() { CamRotateFunc(); }