【问题标题】:Swipe screen to rotate camera滑动屏幕旋转相机
【发布时间】:2015-01-11 19:26:31
【问题描述】:

我正在使用 Unity3D 为智能手机编写 3D 游戏,但不知道如何进行相机旋转(第一人称视角)。

制作虚拟摇杆太难了,所以我决定让相机在屏幕滑动时旋转。

用户在智能手机屏幕上滑动,相机就会转动。

旋转有效,但总是从同一个位置开始。

保存最后一个位置会中断所有旋转(旋转是歪斜的)。

我的代码:

using UnityEngine;
using System.Collections;

public class Look : MonoBehaviour {

public float sensitivityX = 1F;
public float sensitivityY = 1F;

public float minimumX = -360F;
public float maximumX = 360F;

public float minimumY = -25F;
public float maximumY = 25F;

float rotationX = 0F;
float rotationY = 0F;

float oldRotationX = 0F;
float oldRotationY = 0F;

float lastX = 0F;
float lastY = 0F;

Quaternion originalRotation;

void Update ()
{
    if (Input.touches.Length > 0)
    {
        if(Input.touches[0].phase == TouchPhase.Began)
        {
            lastX = Input.touches[0].position.x;
            lastY = Input.touches[0].position.y;

            rotationX = transform.localEulerAngles.x;
            rotationY = transform.localEulerAngles.y;

            oldRotationX = rotationX;
            oldRotationY = rotationY;
        }

        if(Input.touches[0].phase == TouchPhase.Moved)
        {
            rotationX = (oldRotationX + (Input.touches[0].position.x - lastX)) * sensitivityX;
            rotationY = (oldRotationY + (Input.touches[0].position.y - lastY)) * sensitivityY;

            rotationX = ClampAngle (rotationX, minimumX, maximumX);
            rotationY = ClampAngle (rotationY, minimumY, maximumY);

            Quaternion xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up);
            Quaternion yQuaternion = Quaternion.AngleAxis (rotationY, -Vector3.right);

            transform.localRotation = originalRotation * xQuaternion * yQuaternion;
        }

        //this should make rotating from last position, but it
        //makes rotating incorrect (askew)
        //without code below rotating works, but on always
        //starts from the same position
        if(Input.touches[0].phase == TouchPhase.Ended)
        {
            originalRotation = transform.localRotation;
        }
    }
}

void Start ()
{
    if (rigidbody)
        rigidbody.freezeRotation = true;

    originalRotation = transform.localRotation;
}

public static float ClampAngle (float angle, float min, float max)
{
    if (angle < -360F)
        angle += 360F;
    if (angle > 360F)
        angle -= 360F;
    return Mathf.Clamp (angle, min, max);
}
}

请帮助我。谢谢。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您可以使用inputs,特别是触控位置。然后,您可以应用在mouse look script 中实现的类似效果。

    基本上你想要的代码是:

    rotationX += Input.touches[0].position.x * sensitivityX;
    rotationY += Input.touches[0].position.y * sensitivityY
    
    Quaternion xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up);
    Quaternion yQuaternion = Quaternion.AngleAxis (rotationY, -Vector3.right);
    
    transform.localRotation *= xQuaternion * yQuaternion;
    

    【讨论】:

    • 我编辑了我的问题并添加了代码。你能帮助我吗?我具体描述了我的问题。
    【解决方案2】:
    if(Input.touches.Length > 0 && Input.GetTouch(0).phase == TouchPhase.Moved){ 
      transform.Rotate(new Vector3(-Input.GetTouch(0).deltaPosition.y,Input.GetTouch(0).deltaPosition.x,0)*speed*Time.deltaTime);
      transform.rotation=Quaternion.Euler(transform.rotation.eulerAngles.x,transform.rotation.eulerAngles.y,0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 2015-08-12
      • 2015-04-11
      • 1970-01-01
      相关资源
      最近更新 更多