unity3d (Unity 3D)如何让玩家的物体在自己的轴上移动?

hrysbysz  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(178)

我想知道如何让一个玩家在它自己的轴上移动。当玩家的物体旋转时,我希望它向前移动,而不是在全局方向上。当相机旋转时,玩家也旋转。这是两个脚本。
玩家移动

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

public class PlayerMovement : MonoBehaviour
{
    public Rigidbody rb;
    public float playerSpeed;

    private float moveX;
    private float moveY;

    void Update()
    {
        moveX = Input.GetAxis("Horizontal") * Time.deltaTime * playerSpeed;
        moveY = Input.GetAxis("Vertical") * Time.deltaTime * playerSpeed;

        transform.position += new Vector3(moveX, 0, moveY);
    }
}

摄像机控制器

using System.Collections;
using System.Collections.Generic;
using System.Numerics;
using UnityEditor;
using UnityEditor.Experimental.GraphView;
using UnityEngine;

public class CameraControler : MonoBehaviour
{
    public GameObject CameraFocusObject;
    public GameObject CameraPart;

    public Transform orientation;

    float xRot, yRot;

    public int sensX;
    public int sensY;

    // Start is called before the first frame update
    void Start()
    {
        Cursor.visible = false;
        Cursor.lockState = CursorLockMode.Locked;
    }

    // Update is called once per frame
    void Update()
    {
        float mouseX = Input.GetAxisRaw("Mouse X") * Time.deltaTime * sensX;
        float mouseY = Input.GetAxisRaw("Mouse Y") * Time.deltaTime * sensY;

        yRot += mouseX;
        xRot -= mouseY;
        xRot = Mathf.Clamp(xRot, -85f, 85f);

        transform.rotation = UnityEngine.Quaternion.Euler(xRot, yRot, 0);
        CameraFocusObject.transform.rotation = UnityEngine.Quaternion.Euler(0, yRot, 0);
    }
}

我是Unity编程的新手,所以如果你能更具体地回答,那将是有帮助的。

laawzig2

laawzig21#

你想要的是移动你的角色在相机里。向前的方向。
1.你可以使用camera.main.forward方向向量来旋转你的角色在摄影机的方向上,如果你想在行走方向的改变上有一点延迟,这可以使用,例如:
transform.rotation = Quaternion.LookRotation(camera.main.transform.forward);
然后你需要做的就是让你的角色沿着它自己的前进方向行走(transform.forward += movement * Time.deltaTime * moveSpeed
1.你可以使用你的相机。前进的方向你的球员应该走在直接
transform.position += camera.main.transform.forward * Time.deltaTime * moveSpeed
我希望这能有所帮助:)
另外,我建议使用privat字段而不是public,如果你在一个命名空间中使用多个脚本,这一点会更明显(你可以使用“[SerializeField] private GameObject XXX”)〈=这将在检查器中暴露你的字段,即使它们是私有的。
此外,你应该摆脱“使用Unity.Editor”的使用,当你想制作游戏的最终版本时,它们会破坏你的构建:)
干杯

相关问题