玩家旋转,相机旋转,但是x,y,z保持不变?

时间:2018-07-05 06:35:14

标签: c# unity3d

所以我正照常移动相机

public static CameraController Instance{ set; get; }

    public Transform lookAt;
    public Transform camTransform;

    private Camera cam;

    public const float Y_ANGLE_MIN = 0.0f;
    public const float Y_ANGLE_MAX = 50.0f;
    public float distance = 10.0f;
    public float currentX = 0.0f;
    public float currentY = 0.0f;
    public float sensitivityX = 7.0f;
    public float sensitivityY = 7.0f;

    private void Start(){
        Instance = this;
        camTransform = transform;
        cam = Camera.main;
    }

    private void Update(){
        currentX += InputManager.SecondaryHorizontal ();
        currentY += InputManager.SecondaryVertical ();

        currentY = Mathf.Clamp (currentY, Y_ANGLE_MIN, Y_ANGLE_MAX);
    }

    private void LateUpdate(){
        Vector3 dir = new Vector3 (0, 0, -distance);
        Quaternion rotation = Quaternion.Euler(currentY,currentX,0);
        camTransform.position = lookAt.position + rotation * dir;
        camTransform.LookAt (lookAt.position);
        this.transform.position += Vector3.up;
    }

随着相机旋转,我正在旋转播放器

private void Update(){
        this.transform.eulerAngles = CameraController.Instance.camTransform.eulerAngles;
        }

我希望当我的播放器向左旋转时,按下MainVertical()(附加到WASD控件和操纵杆X,Y轴)

public static float MainVertical(){
        float r = 0.0f;
        r += Input.GetAxis ("J_MainVertical");
        r += Input.GetAxis ("K_MainVertical");
        return Mathf.Clamp (r, -1.0f, 1.0f);
    }

将旋转,使玩家朝着forward方向前进

但是角色继续沿原本的forward方向前进。

我只能假设问题是,尽管对象的前向轴已更改,但世界空间中的x,y,z并未更改,而这就是MainVertical()仍在访问的对象

这是我角色移动的代码

private CharacterController controller;
    private Animator anim;

    //Speed settings
    private float walkingSpeed = 5.0f;
    private float runningSpeed = 7.5f;

    //Jump and gravity settings
    private float verticalVelocity;
    private float gravity = 14.0f;
    private float jumpForce = 10.0f;

    private void Start(){
        controller = GetComponent<CharacterController> ();
        anim = GetComponent<Animator> ();
    }

    private void Update(){
        this.transform.eulerAngles = CameraController.Instance.camTransform.eulerAngles;
        Jump ();

        Vector3 moveVector = InputManager.MainJoystick ();
        moveVector.x = moveVector.x * walkingSpeed;
        moveVector.y = verticalVelocity;
        moveVector.z = moveVector.z * walkingSpeed;
        controller.Move (moveVector * Time.deltaTime);

        Vector3 camForward = Vector3.Scale (CameraController.Instance.camTransform.forward, new Vector3 (1, 0, 1)).normalized;


        if (moveVector.x != 0 || moveVector.z != 0) {
            anim.SetBool ("IsIdle", false);
            anim.SetBool ("IsWalking", true);
        } else {
            anim.SetBool ("IsIdle", true);
            anim.SetBool ("IsWalking", false);
        }
    }

    protected void Jump(){
        if (controller.isGrounded) {
            verticalVelocity = -gravity * Time.deltaTime;
            if (InputManager.AButton()) {
                anim.SetTrigger ("Jump");
                verticalVelocity = jumpForce;
            }
        } else {
            verticalVelocity -= gravity * Time.deltaTime;
            //anim.SetTrigger ("Landing");
        }
    }
}

这是我的输入管理器

    // -- Axis

    public static float MainHorizontal(){
        float r = 0.0f;
        r += Input.GetAxis ("J_MainHorizontal");
        r += Input.GetAxis ("K_MainHorizontal");
        return Mathf.Clamp (r, -1.0f, 1.0f);
    }

    public static float MainVertical(){
        float r = 0.0f;
        r += Input.GetAxis ("J_MainVertical");
        r += Input.GetAxis ("K_MainVertical");
        return Mathf.Clamp (r, -1.0f, 1.0f);
    }

    public static Vector3 MainJoystick(){
        return new Vector3 (MainHorizontal (), 0, MainVertical ());
    }

    public static float SecondaryHorizontal(){
        float r = 0.0f;
        r += Input.GetAxis ("J_SecondaryHorizontal");
        r += Input.GetAxis ("Mouse X");
        return Mathf.Clamp (r, -1.0f, 1.0f);
    }

    public static float SecondaryVertical(){
        float r = 0.0f;
        r += Input.GetAxis ("J_SecondaryVertical");
        r += Input.GetAxis ("Mouse Y");
        return Mathf.Clamp (r, -1.0f, 1.0f);
    }

    public static Vector3 SecondaryJoystick(){
        return new Vector3 (SecondaryHorizontal (), SecondaryVertical (), 0);
    }

    // -- Buttons

    public static bool AButton(){
        return Input.GetButtonDown ("A_Button");
    }

    public static bool BButton(){
        return Input.GetButtonDown ("B_Button");
    }

    public static bool XButton(){
        return Input.GetButtonDown ("X_Button");
    }

    public static bool YButton(){
        return Input.GetButtonDown ("Y_Button");
    }

1 个答案:

答案 0 :(得分:2)

这是正确的:

  

我只能认为问题是尽管前轴具有   改变了对象在世界空间中的x,y,z不变,并且   多数民众赞成在MainVertical()仍在访问

您使玩家和this.transform的{​​{1}}感到困惑-它们是2个完全不同的东西,彼此无关。想象一下FIFA,您有11名足球运动员,每个足球运动员都有自己的Input.GetAxis,但您仍然只有一名this.transform

尝试一下:

Input.GetAxis

通常,尝试将您的球员代码与输入代码分开-想象一下如何用1个控制器控制11个足球运动员

编辑: https://docs.unity3d.com/ScriptReference/CharacterController.Move.html

中使用的代码