[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算法]斜抛运动[通俗易懂]

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

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