zoukankan      html  css  js  c++  java
  • [Unity算法]斜抛运动

    斜抛运动:

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

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

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

    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 }

    效果如下:

  • 相关阅读:
    sqlmap参数设置
    SQL注入
    SQL注入基本原理
    信息收集(shodan的使用)
    CDN
    2020软件工程个人作业06——软件工程实践总结作业
    问题清单
    2020软件工程作业05
    2020软件工程作业00——问题清单
    软件工程第三次作业
  • 原文地址:https://www.cnblogs.com/lyh916/p/10398640.html
Copyright © 2011-2022 走看看