欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
            }

Unity C# 椭圆形范围检测
到这里已经满足项目需求了。如果你需要的是闭合的一个椭圆形。调整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");
    }
 }
           
相关标签: 游戏