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

      

  • 相关阅读:
    Direct UI 思想阐述(好多相关文章)
    GetSystemTimeAsFileTime讲解(从1601年1月1日到目前经过的纳秒)
    WPF的消息机制
    CEdit 样式与消息 解析
    vcredist_x86.exe 静默安装方法
    iOS 开发问题集锦(一)
    EM算法详解
    BCP导入导出MsSql
    为什么不能在子类或外部发布C#事件
    HTML5 拖放及排序的简单实现
  • 原文地址:https://www.cnblogs.com/DazeJiang/p/14322258.html
Copyright © 2011-2022 走看看