原文在这里 Sliding a Sphere Player-Controlled Motion
不做什么基础讲解了,总结下文章叙述的技巧。
using UnityEngine;
public class MovingSphere : MonoBehaviour {
[SerializeField, Range(0f, 100f)]
float maxSpeed = 10f;
[SerializeField, Range(0f, 100f)]
float maxAcceleration = 10f;
[SerializeField, Range(0f, 1f)]
float bounciness = 0.5f;
[SerializeField]
Rect allowedArea = new Rect(-5f, -5f, 10f, 10f);
Vector3 velocity;
void Update () {
Vector2 playerInput;
playerInput.x = Input.GetAxis("Horizontal");
playerInput.y = Input.GetAxis("Vertical");
playerInput = Vector2.ClampMagnitude(playerInput, 1f);
Vector3 desiredVelocity =
new Vector3(playerInput.x, 0f, playerInput.y) * maxSpeed;
float maxSpeedChange = maxAcceleration * Time.deltaTime;
velocity.x =
Mathf.MoveTowards(velocity.x, desiredVelocity.x, maxSpeedChange);
velocity.z =
Mathf.MoveTowards(velocity.z, desiredVelocity.z, maxSpeedChange);
Vector3 displacement = velocity * Time.deltaTime;
Vector3 newPosition = transform.localPosition + displacement;
if (newPosition.x < allowedArea.xMin) {
newPosition.x = allowedArea.xMin;
velocity.x = -velocity.x * bounciness;
}
else if (newPosition.x > allowedArea.xMax) {
newPosition.x = allowedArea.xMax;
velocity.x = -velocity.x * bounciness;
}
if (newPosition.z < allowedArea.yMin) {
newPosition.z = allowedArea.yMin;
velocity.z = -velocity.z * bounciness;
}
else if (newPosition.z > allowedArea.yMax) {
newPosition.z = allowedArea.yMax;
velocity.z = -velocity.z * bounciness;
}
transform.localPosition = newPosition;
}
}