ChatGPT Generated Unity3D Character Controller 1 # 腳本 ```C# using UnityEngine; public class MouseCharacterController : MonoBehaviour { public float moveSpeed = 10.0f; public float rotationSpeed = 10.0f; public float gravity = 10.0f; private float verticalSpeed = 0.0f; private float verticalVelocity = 0.0f; private Vector3 moveVector; private CharacterController characterController; private Animator animator; private float rotation = 0.0f; private float angle = 0.0f; private float horizontalVelocity = 0.0f; private float horizontalSpeed = 0.0f; private Vector3 horizontalVector; private Vector3 mousePosition; private float mouseRotation = 0.0f; private float mouseRotationSpeed = 10.0f; private bool isGrounded = false; private bool isJumping = false; private bool isMoving = false; void Start() { characterController = GetComponent<CharacterController>(); animator = GetComponent<Animator>(); } void Update() { // 計算角色的水平位移 horizontalVelocity = Input.GetAxis("Horizontal") * moveSpeed; horizontalVector = transform.forward * horizontalVelocity; // 計算角色的垂直速度 if (isGrounded) { verticalSpeed = 0.0f; if (Input.GetButton("Jump")) { isJumping = true; verticalSpeed = moveSpeed * 2.0f; } } else { verticalSpeed -= gravity * Time.deltaTime; } // 計算角色的垂直位移 verticalVelocity = verticalSpeed * Time.deltaTime; moveVector = new Vector3(0, verticalVelocity, 0); // 移動角色 characterController.Move(horizontalVector * Time.deltaTime); characterController.Move(moveVector); // 計算角色的旋轉角度 mousePosition = Input.mousePosition; mousePosition = Camera.main.ScreenToWorldPoint(new Vector3(mousePosition.x, mousePosition.y, Camera.main.transform.position.y - transform.position.y)); angle = AngleBetweenVector2(transform.position, mousePosition); rotation = angle - transform.eulerAngles.y; // 旋轉角色 transform.Rotate(0, rotation, 0); // 計算角色是否在地面上 isGrounded = (characterController.collisionFlags & CollisionFlags.Below) != 0; // // 計算角色是否正在移動 isMoving = horizontalVelocity > 0.1f || horizontalVelocity < -0.1f; // 更新角色的動畫 animator.SetBool("isGrounded", isGrounded); animator.SetBool("isJumping", isJumping); animator.SetBool("isMoving", isMoving); animator.SetFloat("verticalVelocity", verticalVelocity); animator.SetFloat("horizontalVelocity", horizontalVelocity); // 更新角色的滑鼠旋轉 if (Input.GetMouseButton(1)) { mouseRotation = Input.GetAxis("Mouse X") * mouseRotationSpeed; transform.Rotate(0, mouseRotation, 0); } } // 計算兩個向量之間的角度 float AngleBetweenVector2(Vector2 vec1, Vector2 vec2) { Vector2 diference = vec2 - vec1; float sign = (vec2.y < vec1.y) ? -1.0f : 1.0f; return Vector2.Angle(Vector2.right, diference) * sign; } } ``` # 產生過程: 我: > 幫我產生一個Unity3D角色控制器腳本 ChatGPT: > 您好,我可以幫您產生一個Unity3D角色控制器腳本的概念架構,但實際寫出腳本需要您自己來進行。 > > 首先,請在Unity3D中新建一個C#腳本並命名為"CharacterController"。接著,請在腳本中加入以下程式碼: > ```C# using UnityEngine; public class CharacterController : MonoBehaviour { public float moveSpeed = 10.0f; public float rotationSpeed = 10.0f; public float gravity = 10.0f; private float verticalSpeed = 0.0f; private float verticalVelocity = 0.0f; private Vector3 moveVector; private CharacterController characterController; private Animator animator; private float rotation = 0.0f; private float angle = 0.0f; private float horizontalVelocity = 0.0f; private float horizontalSpeed = 0.0f; private Vector3 horizontalVector; private Vector3 mousePosition; private float mouseRotation = 0.0f; private float mouseRotationSpeed = 10.0f; private bool isGrounded = false; private bool isJumping = false; private bool isMoving = false; void Start() { characterController = GetComponent<CharacterController>(); animator = GetComponent<Animator>(); } void Update() { // 計算角色的水平位移 horizontalVelocity = Input.GetAxis("Horizontal") * moveSpeed; horizontalVector = transform.forward * horizontalVelocity; // 計算角色的垂直速度 if (isGrounded) { verticalSpeed = 0.0f; if (Input.GetButton("Jump")) { isJumping = true; verticalSpeed = moveSpeed * 2.0f; } } else { verticalSpeed -= gravity * Time.deltaTime; } // 計算角色的垂直位移 verticalVelocity = verticalSpeed * Time.deltaTime; moveVector = new Vector3(0, verticalVelocity, 0); // 移動角色 characterController.Move(horizontalVector * Time.deltaTime); characterController.Move(moveVector); // 計算角色的旋轉角度 mousePosition = Input.mousePosition; mousePosition = Camera.main.ScreenToWorldPoint(new Vector3(mousePosition.x, mousePosition.y, Camera.main.transform.position.y - transform.position.y)); angle = AngleBetweenVector2(transform.position, mousePosition); rotation = angle - transform.eulerAngles.y; // 旋轉角色 transform.Rotate(0, rotation, 0); // 計算角色是否在地面上 isGrounded = (characterController.collisionFlags & CollisionFlags.Below) != 0; // ``` 我: > 請從 > isGrounded = (characterController.collisionFlags & CollisionFlags.Below) != 0; > 開始往下列出腳本 ChatGPT: 好的,接下來的程式碼如下: ```C# // 計算角色是否正在移動 isMoving = horizontalVelocity > 0.1f || horizontalVelocity < -0.1f; // 更新角色的動畫 animator.SetBool("isGrounded", isGrounded); animator.SetBool("isJumping", isJumping); animator.SetBool("isMoving", isMoving); animator.SetFloat("verticalVelocity", verticalVelocity); animator.SetFloat("horizontalVelocity", horizontalVelocity); // 更新角色的滑鼠旋轉 if (Input.GetMouseButton(1)) { mouseRotation = Input.GetAxis("Mouse X") * mouseRotationSpeed; transform.Rotate(0, mouseRotation, 0); } } // 計算兩個向量之間的角度 float AngleBetweenVector2(Vector2 vec1, Vector2 vec2) { Vector2 diference = vec2 - vec1; float sign = (vec2.y < vec1.y) ? -1.0f : 1.0f; return Vector2.Angle(Vector2.right, diference) * sign; } ``` > 希望這些程式碼能夠幫助您。