Unity C# 椭圆形范围检测
程序员文章站
2022-04-07 17:29:46
...
项目里需要攻击时进行范围内是否有敌人的检测。
有两种方式可以检测
1:一种是在攻击时添加一个碰撞体,然后瞬间删除,通过碰撞来检测范围内是否有敌人存在。
2:另一种是通过算法来实现,通过怪物的位置来判断是否在攻击范围内。
项目为锁视角2D游戏。因此我需要一个椭圆形的范围,椭圆形的y轴半径是x轴半径的1/2.又因为要做的是普通攻击,所以只需要左侧和右侧的半个椭圆就可以。
- 椭圆形绘制
float angle = 90;//画线的起始角度
for (int i = 0; i < 11; i++) //10*18+18 18°一条线,首尾共11条
{
float hudu = (angle / 180) * Mathf.PI ;
float xx = transform.position.x + 10f * Mathf.Cos(hudu);
float yy = transform.position.y + 5f * Mathf.Sin(hudu);
Debug.DrawLine(transform.position, new Vector3(xx, yy, 0), Color.red);
angle += 18;
}
到这里已经满足项目需求了。如果你需要的是闭合的一个椭圆形。调整i值和angle,i越大,angle越小(条件为angle*(i-1)=360),椭圆形边弧度越圆滑。绘制的时候不要绘制中心到各个点的线,而是改为相邻的点之间绘制。
- 范围检测
Vector3 targetDir = target.position - transform.position;
float angle = Vector3.Angle(transform.right * sa.skeleton.ScaleX * -1, targetDir);//这里是判断角色是否面对怪物的,换成你自己的判断。
//如果玩家面对怪物
if (angle <= 90f)
{
//怪物相对于玩家的带符号的角度。
float angle2 = Vector3.SignedAngle(transform.right, targetDir, Vector3.forward);
float hudu = (angle2 / 180) * Mathf.PI;
float xx = transform.position.x + 10f * Mathf.Cos(hudu);//范围
float yy = transform.position.y + 5f * Mathf.Sin(hudu);//范围
Vector3 rangePos = new Vector3(xx, yy, 0);
//玩家到怪物的真实距离
float realDis = Vector3.Distance(transform.position, target.position);
//玩家到怪物方向的椭圆边上的点与玩家的距离
float rangeDis = Vector3.Distance(transform.position, rangePos);
//真实距离小于方向范围最大距离
if (realDis <= rangeDis)
{
Debug.Log("Hit");
}
}
上一篇: 飞翔小鸟思路及代码
下一篇: 怎样用python绘制折线图