如何根据相机旋转角度使角色旋转?

时间:2016-10-28 12:16:23

标签: c# unity3d

这是我使用附加到主摄像头的脚本。 我可以将相机旋转360度。但是角色(ThirdPersonController)始终处于空闲状态。

我想在旋转相机的同时旋转角色。

我遇到的一个问题是我可以将它旋转到地面下一点点。 如何将相机旋转限制在地面/地形水平? 这是截图我的意思是相机在地形/字符下:

Screenshot

这是脚本代码: 我试图添加这一行来用相机旋转角色,但它没有这样做,它什么也没做。

val filtered_users = users.filter(_.length == x || _.length == x - 1 || _.length == x + 1)

剧本:

<dependency>
  <groupId>org.glassfish</groupId>
  <artifactId>javax.faces</artifactId>
  <version>2.2.13</version>
</dependency>

我创建了一个新的小干净脚本,应根据相机旋转旋转角色。上面的脚本附在主摄像头上。

现在我有了ThirdPersonController,我已经附加了一个脚本:

transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation, rotationSpeed);

这个脚本运行正常。还有旋转相机的上面的脚本。 但是,一旦我连接到ThirdPersonController,新的小脚本应该旋转角色,所以首先它不旋转角色,然后是让角色向前走,整个ClickToMove脚本运行不正常。

using UnityEngine;
using System.Collections;

[AddComponentMenu("Camera-Control/Mouse Orbit with zoom")]
public class MouseOrbitImproved : MonoBehaviour
{

    public Transform target;
    public float distance = 5.0f;
    public float xSpeed = 120.0f;
    public float ySpeed = 120.0f;

    public float yMinLimit = -20f;
    public float yMaxLimit = 80f;

    public float distanceMin = .5f;
    public float distanceMax = 15f;

    private Rigidbody rigidbody;

    float x = 0.0f;
    float y = 0.0f;

    public float rotationSpeed = 5f;

    // Use this for initialization
    void Start()
    {
        Vector3 angles = transform.eulerAngles;
        x = angles.y;
        y = angles.x;

        rigidbody = GetComponent<Rigidbody>();

        // Make the rigid body not change rotation
        if (rigidbody != null)
        {
            rigidbody.freezeRotation = true;
        }
    }

    void LateUpdate()
    {
        if (target)
        {
            x += Input.GetAxis("Mouse X") * xSpeed * distance * 0.02f;
            y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;

            y = ClampAngle(y, yMinLimit, yMaxLimit);

            Quaternion rotation = Quaternion.Euler(y, x, 0);

            distance = Mathf.Clamp(distance - Input.GetAxis("Mouse ScrollWheel") * 5, distanceMin, distanceMax);

            RaycastHit hit;
            if (Physics.Linecast(target.position, transform.position, out hit))
            {
                distance -= hit.distance;
            }
            Vector3 negDistance = new Vector3(0.0f, 0.0f, -distance);
            Vector3 position = rotation * negDistance + target.position;

            transform.rotation = rotation;
            transform.position = position;

            transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation, rotationSpeed);
        }
    }

    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);
    }
}

1 个答案:

答案 0 :(得分:0)

我想只需将 yMinLimit 值调整为 0 或更低就足以限制相机的垂直角度。

关于你的角色轮换,你应该在他身上有一个小脚本,叫做:

Vector3 characterPosition = transform.position;
Vector3 cameraPosition = Camera.main.transform.position;
Vector3 delta = new Vector3(characterPosition.x - characterPosition.x, 0.0f, characterPosition.z - characterPosition.z);
transform.LookAt(delta);

我将 delta 向量的 y 值设置为0,因此只有&#34;水平&#34;将考虑相机的方向。