U3D基础篇之人工智能—敌人视野

    科技2022-08-15  97

    首先在敌人上创建一个空的子物体,然后给这个子物体添加Box Collider组件,然后设置BoxCollider的范围。因为这个范围只是作为触发器进行使用,所以将is trigger进行勾选。然后在这个子物体上添加脚本

    public float fieldOfView = 100f;//敌人发现玩家的视野 public bool playerInSight = false;//玩家是否被发现 public Vector3 playerLastSight; public Vector3 resetPos = Vector3.back; private BoxCollider col; private GameObject player; private void Start() { col = GetComponent<BoxCollider>(); player = GameObject.FindGameObjectWithTag("Player"); playerLastSight = resetPos; } /// <summary> /// 当玩家进入到敌人碰撞体之内时候 /// </summary> /// <param name="other"></param> void OnTriggerStay(Collider other) { if (other.gameObject == player)//如果玩家在敌人的视野内并且中间没有障碍物,则被发现,记录玩家的位置 { Debug.Log("被发现了"); playerInSight = false; Vector3 dir = other.transform.position - transform.position;//玩家的位置和敌人的位置之间连一条线 float angle = Vector3.Angle(dir, transform.forward);//判断玩家的位置是否在敌人的视野范围内 if (angle < fieldOfView * 0.5) { RaycastHit hit;//利用射线查询函数处理障碍物情况 if (Physics.Raycast(transform.position + transform.up, dir.normalized, out hit, col.size.z)) { if (hit.collider.gameObject == player)//在这个射线上打到的物体只有玩家 { playerInSight = true;//玩家被发现了 playerLastSight = player.transform.position;//记录玩家的位置 } } } } }

    因为其中需要要有一个物体是刚体,然后给Player加上Rigidbody组件。

    Processed: 0.010, SQL: 8