//小练习:炸弹攻击范围的判定;如图:
//攻击范围,炸弹范围的50m
//练习题目:计算炸弹到玩家切点坐标,要求随玩家改变位置,切点位置也要跟着改变
//已知条件:玩家的半径(一般实际项目,人物都会使用胶囊(Capsule)作为人物的边界,使用胶囊(Capsule)的Radius作为人物的半径坐标)
//炸弹位置
//思路:
//1.计算玩家到爆炸点方向,只截取玩家边界的半径长向量
//2.计算玩家中心点至切点-爆炸点方向位置的夹角角度,然后根据这个角度旋转。
private Vector3 BoomVector3;
public GameObject TestGameObj; //使用胶囊(Capsule)物体
private Vector3 TestGameObjVector3;
private float TestGameObjRadius;
private Vector3 TwoPointMinus;
private Vector3 TwoPoint;
private float TwoPointAngle;
private Vector3 LeftPoint;
private Vector3 RightPoint;
//有缺陷,切点移动的时候不一致
private void Start()
{
//获取玩家边界半径
TestGameObjRadius = (TestGameObj.GetComponent<CapsuleCollider>().radius);
Debug.Log(TestGameObjRadius);
}
private void Update()
{
CheckQD();
}
//计算切点方法
private void JXQD()
{
//获取炸弹位置
BoomVector3 = this.transform.position;
//获取玩家位置,因为需要实时判断,所以需要放到update上获取。
TestGameObjVector3 = TestGameObj.transform.position;
//两个位置相减得到两个位置的向量
TwoPoint = BoomVector3 - TestGameObjVector3;
//TwoPointMinus = TestGameObjVector3.normalized - BoomVector3.normalized;
//短距离向量的长度获取逻辑:模长归一化,并乘上半径。
TwoPointMinus = TwoPoint.normalized * TestGameObjRadius;
//Debug.Log(TwoPointMinus.magnitude);
//反余弦: arccos b(临边) / c(斜边) = x;
//利用反余弦,计算夹角的角度
TwoPointAngle = Mathf.Acos(TestGameObjRadius / TwoPoint.magnitude) * Mathf.Rad2Deg;
//获得左切点坐标,注意,此处要加上玩家的位置,而且注意是加在旋转角度前的位置!!
LeftPoint = TestGameObj.transform.position + Quaternion.Euler(0, TwoPointAngle, 0) * TwoPointMinus;
//获得右切点坐标,注意,此处要加上玩家的位置,而且注意是加在旋转角度前的位置!!
RightPoint = TestGameObj.transform.position + Quaternion.Euler(0, -TwoPointAngle, 0) * TwoPointMinus;
}
//检测切点方法
public void CheckQD()
{
JXQD();
Debug.DrawLine(BoomVector3, LeftPoint);
Debug.DrawLine(BoomVector3, RightPoint);
}
//案例动图,图片较大,请耐心等候:
|