Плеер вращается, камера вращается, но x, y, z остаются прежними? - PullRequest
0 голосов
/ 05 июля 2018

Итак, я перемещаю камеру так, как ...

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 голосов
/ 05 июля 2018

это правильно:

Я могу только предположить, что проблема в том, что передняя ось имеет изменилось для объекта х, у, г в мировом пространстве не меняется и это то, что MainVertical () по-прежнему имеет доступ к

вы путаете this.transform с игрока и Input.GetAxis - это две совершенно разные вещи, не связанные друг с другом. представьте себе ФИФА, где у вас есть 11 футболистов, у каждого из которых есть свои this.transform, но у вас все еще есть только один Input.GetAxis

попробуйте это:

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

    //Vector3 moveVector = Quaternion.Euler(this.transform.eulerAngles) * InputManager.MainJoystick ();

    // EDIT
    Vector3 moveVector = InputManager.MainJoystick ();
    moveVector = transform.TransformDirection(moveVector);

    moveVector.x = moveVector.x * walkingSpeed;
    moveVector.y = verticalVelocity;
    moveVector.z = moveVector.z * walkingSpeed;

    controller.Move (moveVector * Time.deltaTime);
}

в общем, попытайтесь отделить код вашего игрока от входного кода - попробуйте представить, как вы будете управлять 11 футболистами с 1 контроллером

EDIT: используемый код от https://docs.unity3d.com/ScriptReference/CharacterController.Move.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...