• 物体运动学习笔记(一)


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

      

  • 相关阅读:
    【BUG】android.content.res.Resources$NotFoundException: File res/drawable-xxhdpi/toolbar_line.png from
    关于 折半查找 while 条件 &lt; , &lt;=
    Unity3D——加入剑痕效果(PocketRPG Trail插件)
    用外部物理路由器时使用Neutron dhcp-agent提供的metadata服务(by quqi99)
    项目经理之项目经理注意事项
    让你提前认识软件开发(37):研发流程初探
    1.RunLoop是什么?
    列表类型内置方法
    字符串类型内置方法
    数字类型内置方法
  • 原文地址:https://www.cnblogs.com/DazeJiang/p/14322258.html
Copyright © 2020-2023  润新知