zoukankan      html  css  js  c++  java
  • 物体运动学习笔记(一)

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

      

  • 相关阅读:
    写作的益处
    【转载】德鲁克:激发我一生的七段经历
    PS如何删除灰色的自动切片
    其他经验博文分类链接
    LODOP单个简短问答(小页面无需拖动滚动条)
    LODOP导出excel的页眉页脚
    LODOP导出和写入excel测试
    LODOP导出Excel简短问答和相关博文
    Lodop导出excel带数字格式
    LODOP批量打印判断是否加入队列1
  • 原文地址:https://www.cnblogs.com/DazeJiang/p/14322258.html
Copyright © 2011-2022 走看看