【问题标题】:How can make the character to rotate according to the camera rotation angle?如何让角色根据摄像机旋转角度进行旋转?
【发布时间】:2016-10-28 12:16:23
【问题描述】:

这是我正在使用的附加到主摄像机的脚本。 我可以将相机旋转 360 度。但是角色(ThirdPersonController)一直保持空闲,面对同一个位置。

我想当我旋转相机时,角色也会旋转。

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

这是脚本代码: 我尝试添加这条线以使用相机旋转角色,但它没有这样做,它什么也不做。

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

脚本:

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

我创建了一个新的小干净脚本,它应该根据相机旋转来旋转角色。上述脚本附加到主摄像机。

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

using UnityEngine;
using System.Collections;

public class ClickToMove : MonoBehaviour
{
    public int speed = 5; // Determines how quickly object moves towards position
    public float rotationSpeed = 5f;

    private Vector3 targetPosition;
    private Animator _animator;
    private Vector3 destination;
    private Quaternion targetRotation;

    void Start()
    {
        _animator = GetComponent<Animator>();
        _animator.CrossFade("Idle", 0);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            _animator.CrossFade("Walk", 0);
            Plane playerPlane = new Plane(Vector3.up, transform.position);
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            float hitdist = 0.0f;

            if (playerPlane.Raycast(ray, out hitdist))
            {
                Vector3 targetPoint = ray.GetPoint(hitdist);
                targetPosition = ray.GetPoint(hitdist);
                targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
                destination = targetPosition;
            }
        }

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

        if ((transform.position - destination).magnitude < 0.7f)
        {
            _animator.CrossFade("Idle", 0);
        }
    }
}

这个脚本运行良好。上面还有旋转相机的脚本。 但是一旦我附加到 ThirdPersonController 应该旋转角色的新小脚本,所以首先它不旋转角色,其次它使角色向前走,整个 ClickToMove 脚本都不能正常工作。

using UnityEngine;
using System.Collections;

public class RotateCharacterToCamera : MonoBehaviour {

    void Update () {

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

    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我想只需将 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,因此只会考虑相机的“水平”方向。

    【讨论】:

    • 我没有 camera.Main 相机上没有 Main 属性。我试图创建一个变量,我做了相机 _camera,然后我在启动函数 _camera getcomponent 中做了,但是如果我做了 _camera.我也没有主。所以我只将camera.Main更改为_camera.transform并将脚本附加到我的ThirdPersonCharacter并将主相机拖到检查器中的这个脚本但我是空异常说没有相机连接到ThirdPersonController但试图访问相机。
    • 我还用相机脚本问题更新了我的问题。如果我将相机拖到脚本中,为什么它是空的?
    • @mosheralf 对不起,我打错了:它应该是Camera.main 而不是camera.Main(这可以让您轻松访问主摄像头)。但是,如果您使用公共 Camera 字段,则不再需要 Start() 方法中的行:如果您调用 _camera = GetComponent&lt;Camera&gt;();,则覆盖 Camera 您在检查器中使用 null 对象分配的字段(导致您遇到的错误)。
    • 好的,现在我没有例外。但另一个问题。当我将这个新的小脚本附加到角色上时,它不会用相机旋转角色,也不会让我指出并点击我已经附加到它的脚本。我会展示脚本。
    • 用新的相机脚本和我已经附加到 ThirdPersonController 的脚本更新了我的问题。
    猜你喜欢
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多