[Unity算法]斜抛运动[通俗易懂]

[Unity算法]斜抛运动[通俗易懂]斜抛运动:1.物体以一定的初速度斜向射出去,物体所做的这类运动叫做斜抛运动。2.斜抛运动看成是作水平方向的匀速直线运动和竖直方向的竖直上抛运动的合运动。3.它的运动轨迹是抛物线。Oblique

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

斜抛运动:

1.物体以一定的初速度斜向射出去,物体所做的这类运动叫做斜抛运动。

2.斜抛运动看成是作水平方向的匀速直线运动和竖直方向的竖直上抛运动的合运动。

[Unity算法]斜抛运动[通俗易懂]

3.它的运动轨迹是抛物线。

[Unity算法]斜抛运动[通俗易懂]

 

ObliqueThrow.cs

 1 using System;
 2 using UnityEngine;
 3 
 4 public class ObliqueThrow : MonoBehaviour {
 5 
 6     private readonly float gravity = -9.8f;     //重力加速度
 7     private Vector2 horizontalDir;              //水平方向
 8     private float startSpeed;                   //初速度
 9     private float sinValue;                     //sin值
10     private float cosValue;                     //cos值
11     private Vector3 startPos;                   //开始位置
12     private float endY;                         //结束高度(地面高度)
13     private float timer;                        //运动消耗时间
14     private Action<GameObject> finishCallBack;  //落地后的回调
15     private bool canMove = false;               //能否运动
16 
17     void Update()
18     {
19         if (!canMove)
20         {
21             return;
22         }
23 
24         //移动过程
25         timer = timer + Time.deltaTime;
26 
27         float xOffset = startSpeed * timer * cosValue * horizontalDir.x;
28         float zOffset = startSpeed * timer * cosValue * horizontalDir.y;
29         float yOffset = startSpeed * timer * sinValue + 0.5f * gravity * timer * timer;
30 
31         Vector3 endPos = startPos + new Vector3(xOffset, yOffset, zOffset);
32         if (endPos.y < endY)
33         {
34             endPos.y = endY;
35             canMove = false;
36         }
37         transform.position = endPos;
38 
39         //移动结束
40         if (!canMove)
41         {
42             finishCallBack(gameObject);
43             Destroy(this);
44         }
45     }
46 
47     public void StartMove(Vector2 horizontalDir, float startSpeed, float angle, float endY, Action<GameObject> finishCallBack)
48     {
49         this.horizontalDir = horizontalDir;
50         this.startSpeed = startSpeed;
51         sinValue = Mathf.Sin(Mathf.Deg2Rad * angle);
52         cosValue = Mathf.Cos(Mathf.Deg2Rad * angle);
53         startPos = transform.position;
54         this.endY = endY;
55         timer = 0;
56         this.finishCallBack = finishCallBack;
57         canMove = true;
58     }
59 }

 

TestThrow.cs

 1 using UnityEngine;
 2 using System.Collections.Generic;
 3 
 4 public class TestThrow : MonoBehaviour {
 5 
 6     public GameObject testGo;
 7     private bool isDebug = false; 
 8     private List<GameObject> drawGoList = new List<GameObject>();
 9 
10     void Update ()
11     {
12         if (Input.GetKeyDown(KeyCode.Q))
13         {
14             //半径为1的方向圆
15             float randomNum = Random.Range(0f, 1f);//[0, 1]
16             float x = randomNum * 2 - 1;//[-1, 1]
17             float z = Mathf.Sqrt(1 - x * x);
18             if (Random.Range(0f, 1f) > 0.5f)
19             {
20                 z = -z;
21             }
22 
23             isDebug = true;
24             ObliqueThrow obliqueThrow = testGo.AddComponent<ObliqueThrow>();
25             obliqueThrow.StartMove(new Vector2(1, 0), 5f, 45f, 0f, (go) => {
26                 isDebug = false;
27                 Debug.Log("移动结束");
28             });
29         }
30         else if(Input.GetKeyDown(KeyCode.W))
31         {
32             testGo.transform.position = new Vector3(0f, 5f, 0f);
33             for (int i = 0; i < drawGoList.Count; i++)
34             {
35                 Destroy(drawGoList[i]);
36             }
37             drawGoList.Clear();
38         }
39 
40         if (isDebug)
41         {
42             GameObject go = GameObject.CreatePrimitive(PrimitiveType.Sphere);
43             go.transform.position = testGo.transform.position;
44             go.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
45             drawGoList.Add(go);
46         }
47     }
48 }

 

效果如下:

[Unity算法]斜抛运动[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167332.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 等价类划分法设计测试用例例题_有效等价类测试用例

    等价类划分法设计测试用例例题_有效等价类测试用例等价类划分法设计测试用例

    2022年10月18日
    3
  • Burpsuite教程(一)Burpsuite 火狐谷歌浏览器抓包教程

    Burpsuite教程(一)Burpsuite 火狐谷歌浏览器抓包教程1.1Web抓包火狐抓包环境需求:火狐浏览器代理插件1.打开测试工具BurpSuite,默认工具拦截功能是开启的,颜色较深,我们点击取消拦截。下图取消拦截状态,数据包可以自由通过:2.按下图顺序点击选显卡来到代理设置3.可以看到默认的代理设置情况,本地代理地址:127.0.0.1,代理端口8080。如果前面没有勾选一定要选择勾选。工具代理设置完毕。4.证书安装,浏览器输输入http://burp/,点击图示位置下载证书5配置证书,打开浏览器并导入证书火狐浏览器开打开证

    2022年5月4日
    756
  • matlab图像处理基础「建议收藏」

    matlab图像处理基础「建议收藏」1、MATLAB中图象数据的读取A、imread   imread函数用于读入各种图象文件,其一般的用法为          [X,MAP]=imread(‘filename’,‘fmt’)其中,X,MAP分别为读出的图象数据和颜色表数据,fmt为图象的格式,filename为读取的图象文件(可以加上文件的路径)。例:[X,MAP]=imread(’flowers.t

    2022年10月4日
    3
  • win10工作站激活码_通用破解码「建议收藏」

    win10工作站激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    184
  • YUV格式到底是什么?

    YUV格式到底是什么?简介YUV是视频、图片、相机等应用中使用的一类图像格式,实际上是所有“YUV”像素格式共有的颜色空间的名称。与RGB格式(红-绿-蓝)不同,YUV是用一个称为Y(相当于灰度)的“亮度”分量和两个“色度”分量表示,分别称为U(蓝色投影)和V(红色投影),由此得名。YUV也可以称为YCbCr,虽然这些术语意味着略有不同,但它们往往会混淆并可互换使用。Y表示亮度分量:如果只显示Y的话,…

    2022年7月16日
    26
  • Java中static关键字的作用与用法「建议收藏」

    Java中static关键字的作用与用法「建议收藏」一、static关键字的特点:static是一个修饰符,用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。1.static修饰成员方法static修饰的方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都必须依赖具体的对象才能够被调用。…

    2022年7月9日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号