unity3d怎么获取角色前方30度的怪物
1个回答
展开全部
可以考虑使用相交球加向量计算的方法获取,下面是我自己瞎想的一个方法,希望对你有点帮助吧......
//自己瞎想的方法...
void searchMethod2(float angle)//不使用射线而是使用向量计算方法
{
//这个方法的正方向使用的是X轴正方向
//具体使用的时候非常需要注意正方向的朝向
finds = new List<GameObject> ();//寻找到的列表,避免重复查找
//以自己为中心进行相交球体探测
//实际上身边一定圆周范围内的所有具有碰撞体的单位都会被被这一步探测到
//接下来需要的就是对坐标进行审查
Collider [] emys = Physics.OverlapSphere (this.transform .position, distance);
//使用cos值进行比照,因为在0-180角度范围内,cos是不断下降的
//具体思路就是,判断探测到的物体的cos值如果这个cos值大于标准值,就认为这个单位的角度在侦查范围角度内。
float angleCosValue = Mathf.Cos (change(angle));//莫认真侧角度的cos值作为计算标准
//print ("angleCosValue-"+angleCosValue);
for (int i = 0; i < emys.Length; i++)//开始对相交球体探测物体进行排查
{
if (emys [i].GetComponent <Collider>().gameObject != this.gameObject) //相交球最大的问题就是如果自身有碰撞体,自己也会被侦测到
{
//print ("name-"+ emys [i].name);
Vector3 thisToEmy = emys [i].transform.position - this.transform.position;//目标坐标减去自身坐标
Vector2 theVectorToSearch = (new Vector2 (thisToEmy.x, thisToEmy.z)).normalized;//转成2D坐标,高度信息在这个例子中被无视
//同时进行单位化,简化计算向量cos值的时候的计算
Vector2 theVectorForward = (new Vector2 (this.transform.right.x, this.transform.right.z)).normalized;//转成2D坐标,高度信息在这个例子中被无视
//同时进行单位化,简化计算向量cos值的时候的计算
float cosValue = (theVectorForward.x * theVectorToSearch.x + theVectorForward.y * theVectorToSearch.y);//因为已经单位化,就没必要再进行求模计算了
//print ("cosValue-" + cosValue);
/*
* 先求出两个向量的模
再求出两个向量的向量积
|a|=√[x1^2+y1^2]
|b|=√[x2^2+y2^2]
a*b=(x1,y1)(x2,y2)=x1x2+y1y2
cos=a*b/[|a|*|b|]
=(x1x2+y1y2)/[√[x1^2+y1^2]*√[x2^2+y2^2]]
*
*/
if (cosValue >= angleCosValue)//如果cos值大于基准值,认为这个就是应该被探测的目标
{
if (finds.Contains (emys [i].GetComponent<Collider> ().gameObject) == false) //不重复地放到已找到的列表里面
{
finds.Add (emys [i].GetComponent<Collider> ().gameObject);
print ("SeachFind "+emys [i].GetComponent<Collider> ().gameObject.name);//找到目标
}
}
}
}
}
//好吧,排版就这样.....
//自己瞎想的方法...
void searchMethod2(float angle)//不使用射线而是使用向量计算方法
{
//这个方法的正方向使用的是X轴正方向
//具体使用的时候非常需要注意正方向的朝向
finds = new List<GameObject> ();//寻找到的列表,避免重复查找
//以自己为中心进行相交球体探测
//实际上身边一定圆周范围内的所有具有碰撞体的单位都会被被这一步探测到
//接下来需要的就是对坐标进行审查
Collider [] emys = Physics.OverlapSphere (this.transform .position, distance);
//使用cos值进行比照,因为在0-180角度范围内,cos是不断下降的
//具体思路就是,判断探测到的物体的cos值如果这个cos值大于标准值,就认为这个单位的角度在侦查范围角度内。
float angleCosValue = Mathf.Cos (change(angle));//莫认真侧角度的cos值作为计算标准
//print ("angleCosValue-"+angleCosValue);
for (int i = 0; i < emys.Length; i++)//开始对相交球体探测物体进行排查
{
if (emys [i].GetComponent <Collider>().gameObject != this.gameObject) //相交球最大的问题就是如果自身有碰撞体,自己也会被侦测到
{
//print ("name-"+ emys [i].name);
Vector3 thisToEmy = emys [i].transform.position - this.transform.position;//目标坐标减去自身坐标
Vector2 theVectorToSearch = (new Vector2 (thisToEmy.x, thisToEmy.z)).normalized;//转成2D坐标,高度信息在这个例子中被无视
//同时进行单位化,简化计算向量cos值的时候的计算
Vector2 theVectorForward = (new Vector2 (this.transform.right.x, this.transform.right.z)).normalized;//转成2D坐标,高度信息在这个例子中被无视
//同时进行单位化,简化计算向量cos值的时候的计算
float cosValue = (theVectorForward.x * theVectorToSearch.x + theVectorForward.y * theVectorToSearch.y);//因为已经单位化,就没必要再进行求模计算了
//print ("cosValue-" + cosValue);
/*
* 先求出两个向量的模
再求出两个向量的向量积
|a|=√[x1^2+y1^2]
|b|=√[x2^2+y2^2]
a*b=(x1,y1)(x2,y2)=x1x2+y1y2
cos=a*b/[|a|*|b|]
=(x1x2+y1y2)/[√[x1^2+y1^2]*√[x2^2+y2^2]]
*
*/
if (cosValue >= angleCosValue)//如果cos值大于基准值,认为这个就是应该被探测的目标
{
if (finds.Contains (emys [i].GetComponent<Collider> ().gameObject) == false) //不重复地放到已找到的列表里面
{
finds.Add (emys [i].GetComponent<Collider> ().gameObject);
print ("SeachFind "+emys [i].GetComponent<Collider> ().gameObject.name);//找到目标
}
}
}
}
}
//好吧,排版就这样.....
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询