[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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 测试常见面试题之场景测试回答策略(如电梯该怎么测等)

    测试常见面试题之场景测试回答策略(如电梯该怎么测等)1.概述这类问题是考察面试者测试思路和测试策略的常见问题,主要要根据软件质量的六个特性(功能性、易用性、效率、可靠性、可维护性、可移植性)来进行思考,进而需要结合实际测试软件时考虑的角度,比如功能方面、接口方面、性能方面、维护难度方面、兼容性方面、界面或者说外观方面(比如本地化的一些内容以及界面美观等等)、操作难度或者说易用性方面、可靠度(比如应对异常情况的能力)方面、安全性方面等,根据这些角度结合具体要测试的内容进行思考并作答,例如,在下例中,分别从功能、界面、易用、兼容、安全、性能这六个角度结合业

    2022年6月7日
  • python聊天室(tkinter写界面,treading,socket实现私聊群聊查看聊天记录,mysql存储数据)

    python聊天室(tkinter写界面,treading,socket实现私聊群聊查看聊天记录,mysql存储数据)一、前言我用的是面向对象写的,把界面功能模块封装成类,然后在客户端创建对象然后进行调用。好处就是方便我们维护代码以及把相应的信息封装起来,每一个实例都是各不相同的。所有的界面按钮处理事件都在客户端,在创建界面对象是会把客户端的处理事件函数作为创建对象的参数,之后再按钮上绑定这个函数,当点击按钮时便会回调函数二、登录界面实现登录界面模块chat_login_panel.pyfromtkinterimport*#导入模块,用户创建GUI界面#登陆界面类classLoginPane

    2022年10月27日
  • DDD中的建模方法有哪些[通俗易懂]

    DDD中的建模方法有哪些[通俗易懂]一、背景在之前的文章中已经介绍了DDD相关的概念模式,DDD相关的业务技术架构,但是我们还没有找到一个核心的抓手去实践DDD。DDD的一个核心本质就是对业务建模,或者领域建模。说的很简单,但是做好确实很难,一个需求过来意淫几个实体对象就差不多解决了。深入看,全局看只在脑海中进行的建模实际上并不一定正确和稳定。因此我们需要找到正确的方法帮助对业务领域进行分析,得到建模结构,共享建模成果。二、四色建模法2.1起源&概念&要素关于四色建模的概念我们可与追溯到90年代,起源于四色原型。四色

    2022年9月2日
  • fscanf()函数具体解释

    fscanf()函数具体解释

    2021年12月15日
  • jQuery+CSS3文字跑马灯特效

    jQuery+CSS3文字跑马灯特效是一款将跑马灯背景制作为3D立方体效果,文字在上面移动时,就像是文字投影到墙壁上,在转角出会改变运动方向。效果展示 http://hovertree.co

    2021年12月27日
  • 投影矩阵推导_矩阵投影变换

    投影矩阵推导_矩阵投影变换概要投影变换是计算机图形学的基础,理解并推导投影矩阵也是很有必要的。正交投影比较简单,没有透视失真效果(近大远小)。而透视投影比较符合人类的眼睛感知,平行线在远处会相交于一点。投影是通过一个4×4的矩阵来完成的,将视锥映射成标准观察体(齐次裁剪空间)。正交投影OpenGLOpenGL采用的是右手坐标系,z轴朝屏幕向外,因此观察方向是朝着z轴负方向的,那么将x,y,z坐标从区间[l,r],

    2022年10月4日

发表回复

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

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