跟着CatLike大神的教程敲了一遍,记录下学习心得。地址:https://catlikecoding.com/unity/tutorials/
通过Transform的position移动。
一、通过加速度限制运动物体的速度改变量可以使物体运动更平滑
float maxSpeedChange = maxAcceleration * Time.deltaTime; velocity.x = Mathf.MoveTowards(velocity.x,desiredVelocity.x,maxSpeedChange); velocity.z = Mathf.MoveTowards(velocity.z,desiredVelocity.z,maxSpeedChange);
二、运动物体撞到障碍物反弹速度=-物体速度*障碍物的反弹系数
if (newPos.x < allowedArea.xMin) { newPos.x = allowedArea.xMin; velocity.x = -velocity.x * bounciness; } else if (newPos.x > allowedArea.xMax) { newPos.x = allowedArea.xMax; velocity.x = -velocity.x * bounciness; } if (newPos.z < allowedArea.yMin) { newPos.z = allowedArea.yMin; velocity.z = -velocity.z * bounciness; } else if (newPos.z > allowedArea.yMax) { newPos.z = allowedArea.yMax; velocity.z = -velocity.z * bounciness; }
完整代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class MovingSphere : MonoBehaviour { [SerializeField,Range(0,10)] float maxSpeed = 10; [SerializeField, Range(0, 10)] float maxAcceleration = 10; Vector3 velocity; [SerializeField] //移动范围 Rect allowedArea = new Rect(-5f,-5f,10f,10f); [SerializeField, Range(0f, 1f)] //反弹系数 float bounciness = 0.5f; private 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,0,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 newPos = transform.localPosition + displacement; if (newPos.x < allowedArea.xMin) { newPos.x = allowedArea.xMin; velocity.x = -velocity.x * bounciness; } else if (newPos.x > allowedArea.xMax) { newPos.x = allowedArea.xMax; velocity.x = -velocity.x * bounciness; } if (newPos.z < allowedArea.yMin) { newPos.z = allowedArea.yMin; velocity.z = -velocity.z * bounciness; } else if (newPos.z > allowedArea.yMax) { newPos.z = allowedArea.yMax; velocity.z = -velocity.z * bounciness; } transform.localPosition = newPos; } }