public void Explore() { this.anim.speed = 0.8f; this.anim.Play("Explore"); this._noise.Frequency = _noiseFrequency; this._noise.Step(); Quaternion current_rot = this.transform.rotation; ObstacleAvoidInfo obs_info = this.GetObstacleAvoidInfo(); //Vector3 ex_pos = this.transform.position; float delta = this._stepFrequency * Time.deltaTime; Quaternion target_rot; if (obs_info.is_hit) { target_rot = Quaternion.LookRotation(obs_info.dir); this.transform.rotation = Quaternion.Slerp(current_rot, target_rot, obs_info.turning_rate); } else { target_rot = this._noise.Rotation(0, 90f, 360f, 90f); this.transform.rotation = Quaternion.Slerp(current_rot, target_rot, delta); } this.transform.position += this.transform.forward * delta; //Debug.DrawLine(ex_pos, this.transform.position, Color.blue); //Debug.Log("rot: " + this.transform.rotation.eulerAngles); }
private ObstacleAvoidInfo GetObstacleAvoidInfo() { ObstacleAvoidInfo obs_info = new ObstacleAvoidInfo(); obs_info.dir = Vector3.zero; RaycastHit hit; float hit_distance = float.MaxValue; if (Physics.Raycast(this.transform.position, this.transform.forward, out hit, this._obstacle_detecting_distance)) { if (hit.transform != transform) { Debug.DrawLine(this.transform.position, hit.point, Color.red); obs_info.is_hit = true; obs_info.dir = hit.normal; hit_distance = Mathf.Min(hit_distance, Vector3.Distance(this.transform.position, hit.point)); } } //Debug.Log("extends: " + this.bodyObj.GetComponent<Renderer>().bounds.extents); Vector3 leftR = this.transform.localPosition; Vector3 rightR = this.transform.localPosition; float wingDistance = this.bodyObj.GetComponent <Renderer>().bounds.extents.x; leftR.x -= wingDistance; rightR.x += wingDistance; //Left if (Physics.Raycast(leftR, this.transform.forward, out hit, this._obstacle_detecting_distance)) { if (hit.transform != transform) { Debug.DrawLine(leftR, hit.point, Color.red); obs_info.is_hit = true; obs_info.dir = hit.normal; hit_distance = Mathf.Min(hit_distance, Vector3.Distance(this.transform.position, hit.point)); } } //Right if (Physics.Raycast(rightR, this.transform.forward, out hit, this._obstacle_detecting_distance)) { if (hit.transform != transform) { Debug.DrawLine(rightR, hit.point, Color.red); obs_info.is_hit = true; obs_info.dir = hit.normal; hit_distance = Mathf.Min(hit_distance, Vector3.Distance(this.transform.position, hit.point)); } } if (0 < hit_distance && hit_distance < this._obstacle_detecting_distance) { //Has obstacle objects in the distance obs_info.turning_rate = Util.Remap(hit_distance, 0, this._obstacle_detecting_distance, 1, 0); //0~obs -> 1~0 //Debug.Log("d: " + hit_distance + ", obstacle_dist: " + this._obstacle_detecting_distance + ", turning_rate: " + turning_rate); } else { //No obstacle objects obs_info.turning_rate = Time.deltaTime; } return(obs_info); }