物体运动学习笔记(一)

跟着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;
    }
}

  

原文地址:https://www.cnblogs.com/DazeJiang/p/14322258.html