- Unity 5.x Game AI Programming Cookbook
- Jorge Palacios
- 340字
- 2021-07-09 19:37:49
Predicting a projectile's landing spot
After a projectile is shot, some agents need to make a run for it, if we're talking about a grenade, or look at it when we're developing a sports game. In either case, it's important to predict the projectile's landing spot in order to make decisions:
Getting ready
Before we get into predicting the landing position, it's important to know the time left before it hits the ground (or reaches a certain position). Thus, instead of creating new behaviors, we need to update the Projectile
class.
How to do it...
- First, we need to add the
GetLandingTime
function to compute the landing time:public float GetLandingTime (float height = 0.0f) { Vector3 position = transform.position; float time = 0.0f; float valueInt = (direction.y * direction.y) * (speed * speed); valueInt = valueInt - (Physics.gravity.y * 2 * (position.y - height)); valueInt = Mathf.Sqrt(valueInt); float valueAdd = (-direction.y) * speed; float valueSub = (-direction.y) * speed; valueAdd = (valueAdd + valueInt) / Physics.gravity.y; valueSub = (valueSub - valueInt) / Physics.gravity.y; if (float.IsNaN(valueAdd) && !float.IsNaN(valueSub)) return valueSub; else if (!float.IsNaN(valueAdd) && float.IsNaN(valueSub)) return valueAdd; else if (float.IsNaN(valueAdd) && float.IsNaN(valueSub)) return -1.0f; time = Mathf.Max(valueAdd, valueSub); return time; }
- Now, we add the
GetLandingPos
function to predict the landing spot:public Vector3 GetLandingPos (float height = 0.0f) { Vector3 landingPos = Vector3.zero; float time = GetLandingTime(); if (time < 0.0f) return landingPos; landingPos.y = height; landingPos.x = firePos.x + direction.x * speed * time; landingPos.z = firePos.z + direction.z * speed * time; return landingPos; }
How it works...
First, we solve the equation from the previous recipe for a fixed height and, given the projectile's current position and speed, we are able to get the time at which the projectile will reach the given height.
There's more...
Take into account the NaN
validation. It's placed that way because there may be two, one, or no solution to the equation. Furthermore, when the landing time is less than zero, it means the projectile won't be able to reach the target height.
- 計算機組成原理與接口技術:基于MIPS架構實驗教程(第2版)
- 數據庫原理及應用教程(第4版)(微課版)
- Mastering Ninject for Dependency Injection
- 文本挖掘:基于R語言的整潔工具
- 企業級數據與AI項目成功之道
- 重復數據刪除技術:面向大數據管理的縮減技術
- 達夢數據庫運維實戰
- 淘寶、天貓電商數據分析與挖掘實戰(第2版)
- INSTANT Android Fragmentation Management How-to
- 數據庫應用系統開發實例
- MySQL DBA修煉之道
- Unity 2018 By Example(Second Edition)
- SQL進階教程(第2版)
- Nagios Core Administrators Cookbook
- 高效使用Redis:一書學透數據存儲與高可用集群