//脚本挂在炸弹上,案例演示圆球为炸弹,黄色圆柱体为玩家!
//有缺陷版本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MathWork : MonoBehaviour
{
//小练习:炸弹攻击范围的判定;如图:
//攻击范围,炸弹范围的50m
//练习题目:计算炸弹到玩家切点坐标,要求随玩家改变位置,切点位置也要跟着改变
//已知条件:玩家的半径(一般实际项目,人物都会使用胶囊(Capsule)作为人物的边界,使用胶囊(Capsule)的Radius作为人物的半径坐标)
//炸弹位置
//思路:
//1.计算玩家到爆炸点方向,只截取玩家边界的半径长向量
//2.计算玩家中心点至切点-爆炸点方向位置的夹角角度,然后根据这个角度旋转。
private Vector3 BoomVector3;
public GameObject TestGameObj;
private Vector3 TestGameObjVector3;
private float TestGameObjRadius;
private Vector3 TwoPointMinus;
private Vector3 TwoPointMinus1;
private float TwoPoint;
private float TwoPointAngle;
//有缺陷,切点移动的时候不一致
private void Start()
{
//获取玩家边界半径
TestGameObjRadius = (TestGameObj.GetComponent<CapsuleCollider>().radius) / 2;
}
private void Update()
{
JXQD();
}
//计算切点方法
private void JXQD()
{
//获取炸弹位置
BoomVector3 = this.transform.position;
//获取玩家位置,因为需要实时判断,所以需要放到update上获取。
TestGameObjVector3 = TestGameObj.transform.position;
//测量两点间距
TwoPoint = Vector3.Distance(BoomVector3, TestGameObjVector3);
TwoPointMinus = BoomVector3.normalized - TestGameObjVector3.normalized;
//TwoPointMinus = TestGameObjVector3.normalized - BoomVector3.normalized;
//模长归一化
TwoPointMinus = TwoPointMinus.normalized;
Debug.Log(TwoPointMinus.magnitude);
//Debug.DrawLine(TestGameObjVector3, BoomVector3);
//Debug.DrawLine(Vector3.zero, TwoPointMinus);
//反余弦: arccos b(临边) / c(斜边) = x;
//利用反余弦,计算夹角的角度
TwoPointAngle = Mathf.Acos(1 / TwoPoint) * Mathf.Rad2Deg;
//获得左切点坐标
TwoPointMinus = (TestGameObj.transform.rotation * Quaternion.Euler(0, TwoPointAngle, 0)) * (TestGameObj.transform.position + TwoPointMinus);
//获得右切点坐标
TwoPointMinus1 = (TestGameObj.transform.rotation * Quaternion.Euler(0, -TwoPointAngle, 0)) * (TestGameObj.transform.position + TwoPointMinus);
Debug.DrawLine(BoomVector3, TwoPointMinus);
Debug.DrawLine(BoomVector3, TwoPointMinus1);
}
}
脚本动图:
|