Unity中通过射线躲避障碍物寻路的一些初步探索

前些日子学了射线寻路的方法,通过往前发出一条射线,如果射线击中的障碍物位置点的法线在射线的右侧,则往右侧转向,如果在左侧,则往左侧转向。如下图所示:


//以下方法为通过对比射线射中的法线来进行躲避障碍物
if (Physics.Raycast (transform.position + Vector3.up * 0.5f, transform.forward, out hit, 10f, lmBarrier)) { //往该角色提高半米的位置的前方发射一条10米的射线,如果有射中障碍物层级的物体
    float rotateDir = Vector3.Dot (transform.right, hit.normal); //获取角色右方向与击中位置的法线的点乘结果,主要用于判断障碍物位置,是在角色左边还是右边
    Debug.DrawRay (transform.position + Vector3.up * 0.5f, transform.forward * 7, Color.red); 
    Debug.DrawRay (hit.point, hit.normal, Color.blue);
    if (rotateDir >= 0) {  //如果大于等于0
        transform.Rotate (transform.up * 90 * Time.deltaTime);  //则往顺时针方向以90度每秒的方向转动
        lookReTime = 0; //避免在躲避障碍物的时候,还会朝向玩家,易发生相反转向
    } else {
        transform.Rotate (transform.up * -90 * Time.deltaTime);  //则往逆时针方向以90度每秒的方向转动
	    lookReTime = 0; 
	}

这样子确实能躲避一些简单的障碍物,但是我们很快就可以发现,会有一些问题:当碰到两个障碍物在一起形成夹角时,很有可能导致在这个角落里来回转动,再也走不出这个角落了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值