Constraining Position - Done!

This commit is contained in:
_Redstone_c_ 2021-02-01 18:56:10 +08:00
parent 59d464eac4
commit c7ad4d418f
2 changed files with 41 additions and 1 deletions

View File

@ -627,3 +627,11 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
maxSpeed: 10 maxSpeed: 10
maxAcceleration: 10
bounciness: 0.5
allowedArea:
serializedVersion: 2
x: -4.5
y: -4.5
width: 9
height: 9

View File

@ -8,6 +8,12 @@ public class MovingSphere : MonoBehaviour
[SerializeField, Range(0f, 100f)] [SerializeField, Range(0f, 100f)]
private float maxAcceleration = 10f; private float maxAcceleration = 10f;
[SerializeField, Range(0f, 1f)]
private float bounciness = 0.5f;
[SerializeField]
private Rect allowedArea = new Rect(-5f, -5f, 10f, 10f);
private Vector3 velocity; private Vector3 velocity;
private void Update() private void Update()
@ -21,6 +27,32 @@ public class MovingSphere : MonoBehaviour
velocity.x = Mathf.MoveTowards(velocity.x, desiredVelocity.x, maxSpeedChange); velocity.x = Mathf.MoveTowards(velocity.x, desiredVelocity.x, maxSpeedChange);
velocity.z = Mathf.MoveTowards(velocity.z, desiredVelocity.z, maxSpeedChange); velocity.z = Mathf.MoveTowards(velocity.z, desiredVelocity.z, maxSpeedChange);
var displacement = velocity * Time.deltaTime; var displacement = velocity * Time.deltaTime;
transform.localPosition += displacement; var 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;
}
if (!allowedArea.Contains(new Vector2(newPosition.x, newPosition.z)))
{
newPosition.x = Mathf.Clamp(newPosition.x, allowedArea.xMin, allowedArea.xMax);
newPosition.z = Mathf.Clamp(newPosition.z, allowedArea.yMin, allowedArea.yMax);
}
transform.localPosition = newPosition;
} }
} }