UnityScripterAI
Discord ↗
Link Copied to Clipboard
×
"create a 3d player controller that can walk, run, jump, roll and attack."
```csharp using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { public float walkSpeed = 2; public float runSpeed = 6; public float gravity = -12; public float jumpHeight = 1; [Range(0, 1)] public float airControlPercent; public float turnSmoothTime = 0.2f; float turnSmoothVelocity; public float speedSmoothTime = 0.1f; float speedSmoothVelocity; float currentSpeed; float velocityY; Animator animator; Transform cameraT; CharacterController controller; void Start() { animator = GetComponent<Animator>(); cameraT = Camera.main.transform; controller = GetComponent<CharacterController>(); } void Update() { // input Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); Vector2 inputDir = input.normalized; bool running = Input.GetKey(KeyCode.LeftShift); // movement Move(inputDir, running); // animator float animationSpeedPercent = ((running) ? currentSpeed / runSpeed : currentSpeed / walkSpeed * .5f); animator.SetFloat("speedPercent", animationSpeedPercent, speedSmoothTime, Time.deltaTime); // jump if (Input.GetKeyDown(KeyCode.Space)) { Jump(); } // attack if (Input.GetMouseButtonDown(0)) { Attack(); } // roll if (Input.GetKeyDown(KeyCode.LeftControl)) { Roll(); } } void Move(Vector2 inputDir, bool running) { if (inputDir != Vector2.zero) { float targetRotation = Mathf.Atan2(inputDir.x, inputDir.y) * Mathf.Rad2Deg + cameraT.eulerAngles.y; transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref turnSmoothVelocity, turnSmoothTime); } float targetSpeed = ((running) ? runSpeed : walkSpeed) * inputDir.magnitude; currentSpeed = Mathf.SmoothDamp(currentSpeed, targetSpeed, ref speedSmoothVelocity, speedSmoothTime); velocityY += Time.deltaTime * gravity; Vector3 velocity = transform.forward * currentSpeed + Vector3.up * velocityY; controller.Move(velocity * Time.deltaTime); currentSpeed = new Vector2(controller.velocity.x, controller.velocity.z).magnitude; if (controller.isGrounded) { velocityY = 0; } } void Jump() { if (controller.isGrounded) { float jumpVelocity = Mathf.Sqrt(-2 * gravity * jumpHeight); velocityY = jumpVelocity; } } void Attack() { animator.SetTrigger("attack"); } void Roll() { animator.SetTrigger("roll"); } } ``` This script assumes that you have a CharacterController component attached to your player object, and that you have animations set up for walking, running, jumping, attacking, and rolling. The animations are triggered through an Animator component, which should also be attached to your player object.