物体运动学习笔记(一)
跟着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;
}
}

浙公网安备 33010602011771号