Unity 3D平台 - 运行速度更改为控制器杆输入

时间:2018-04-23 18:32:16

标签: c# unity3d

在遵循一些指南之后,我制作了一个我喜欢的平台游戏控制器。我现在需要弄清楚的是如何使角色的速度适应控制杆被推入的输入量。 (最小输入=角色行走与最大输入=角色运行)这是我到目前为止所拥有的。我对编码还很陌生,所以我知道解决方案应该不难理解,但我仍然希望得到一些帮助。谢谢!

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

public class PlayerCharacterController : MonoBehaviour {

static Animator anim;

public bool walking;

public GameObject playerModel;

//Transforms
public Transform playerCam, character, centerPoint;

private Vector3 moveDirection;

//character controller declaration
CharacterController player;

//Mouse Rotation
private float rotX, rotY;

//Mouse Y Position
public float mouseYPosition = 1f;

//Mouse Sensitivity
public float Sensitivity = 10f;

//Mouse Zoom
private float zoom;
public float zoomSpeed = 2;

//Clamping Zoom
public float zoomMin = -2f;
public float zoomMax = -10f;

public float rotationSpeed = 5f;

//Move Front Back left & Right
private float moveFB, moveLR;

//Movement Speed
public float Speed = 2f;

//Velocity of Gravity
public float verticalVelocity;

//Jump Distance
public float jumpDist = 5f;

//Multiple Jumps
int jumpTimes;

//To use with Dialogue Manager
public DialogueManager DiagM;

public AudioClip jumpSound;

AudioSource audioSource;


// Use this for initialization
void Start ()



{
    //character controller
    player = GameObject.Find("Player").GetComponent<CharacterController> ();

    anim = GetComponent<Animator>();

    //mouse zoom
    zoom = -3;

    centerPoint.transform.position = playerCam.transform.position;
    centerPoint.transform.parent = null;

    audioSource = GetComponent<AudioSource>();

}

// Update is called once per frame

void Update ()

{

    //if (DiagM.StartDialogue)
    //{ return; }

    //Mouse Zoom Input
    zoom += Input.GetAxis ("Mouse ScrollWheel") * zoomSpeed;
    if (zoom > zoomMin)
        zoom = zoomMin;
    if (zoom < zoomMax)
        zoom = zoomMax;

    //Mouse Camera Input
    playerCam.transform.localPosition = new Vector3 (0, 0, zoom);

    //Mouse Rotation

    rotX += Input.GetAxis ("Mouse X") * Sensitivity;
    rotY -= Input.GetAxis ("Mouse Y") * Sensitivity;      

    //Clamp Camera

    rotY = Mathf.Clamp (rotY, -60f, 60f);
    playerCam.LookAt (centerPoint);
    centerPoint.localRotation = Quaternion.Euler (rotY, rotX, 0);




    //Movement Speed

    moveDirection = (transform.forward * Input.GetAxis("Vertical")) + (transform.right * Input.GetAxis("Horizontal"));
    moveDirection = moveDirection.normalized * Speed;
    moveDirection.y = verticalVelocity;

    player.Move(moveDirection * Time.deltaTime);



    //Movement Rotation

    centerPoint.position = new Vector3 (character.position.x, character.position.y + mouseYPosition, character.position.z);



    //Movement Input
    if (Input.GetAxis ("Vertical") != 0 || Input.GetAxis ("Horizontal") != 0)

    {

        transform.rotation = Quaternion.Euler(0f, centerPoint.rotation.eulerAngles.y, 0f);          
        Quaternion turnAngle = Quaternion.LookRotation(new Vector3(moveDirection.x, 0f, moveDirection.z));
        playerModel.transform.rotation = Quaternion.Slerp (playerModel.transform.rotation, turnAngle, Time.deltaTime * rotationSpeed);

            anim.SetBool("isWalking",true);

    }
        else
    {
            anim.SetBool("isWalking",false);
    }  


    if (player.isGrounded == true)

    {
        jumpTimes = 0;
        verticalVelocity  = -Physics.gravity.y * Time.deltaTime;
    }

    else

    {
        verticalVelocity += Physics.gravity.y * Time.deltaTime;
    }

    if (jumpTimes < 1)

    {
        //Jump Input
        if (Input.GetButtonDown ("Jump"))
        {
            verticalVelocity += jumpDist;

            anim.SetTrigger("isJumping");

            audioSource.PlayOneShot(jumpSound, 1F);

            jumpTimes += 1;
        }
    }


}

}

1 个答案:

答案 0 :(得分:1)

这一行     moveDirection = moveDirection.normalized * Speed; 应该改变这个     moveDirection = moveDirection * Speed;

将矢量标准化将其长度设置为1.在您的情况下,您希望其长度与操纵杆的推动距离相对应,因此不应对其进行标准化。