Ship has to avoid an obstacle without using Unity's Physics
Hello,
I am doing a small exercise which consists of making a ship avoid an obstacle on its way without using unity's physics (so no raycast nor colliders). The ship spawn randomly on one side of the sea and has to go to a random destination on the opposite side. However, I want it to smoothly follow the curves of the red cylinder (obstacle).
Please see the small video here for a quick view of what my ship is doing now : https://youtu.be/KETzTMfoWbQ
In the code, the ship is referred as _cube. and here is my code :
public class ShipMover : MonoBehaviour {
[SerializeField]private GameObject _cube;
[SerializeField]private GameObject cylinder;
[SerializeField]private float _speed = 3.0f;
private Vector3 _startPos;
private Vector3 _endPos;
private Vector3 dir;
private float angle;
[SerializeField] private float turnSpeed = 10f;
private void Update ()
{
//Gets the distance from the ship to the cylinder
float distanceToCylinder = Vector3.Distance (_cube.transform.position, cylinder.transform.position);
// if to close from the cylinder, will change the direction drasticly to avoid hitting the cylinder.
if (distanceToCylinder < 3.1f && _cube.transform.position.z <= 0)
{
dir = -Vector3.forward; //if the ship Z position is < 0, orients the ship to go down
}
else if (distanceToCylinder < 3.1f && _cube.transform.position.z > 0)
{
dir = Vector3.forward; //if the ship Z position is > 0, orients the ship to go up
}
else if (distanceToCylinder > 3.5f)
{
dir = (_endPos - _cube.transform.position).normalized; //otherwise orients the ship towards the end destination
}
// Computes the angle
float targetAngle = Mathf.Atan2 (dir.x, dir.z) * Mathf.Rad2Deg + 90;
//slowly go towards this value
angle = Mathf.LerpAngle (angle, targetAngle, turnSpeed * Time.deltaTime );
//rotates the ship
_cube.transform.eulerAngles = Vector3.up * angle ;
//moves the ship
_cube.transform.position = _cube.transform.position + dir * Time.deltaTime * _speed;
//_cube.transform.position = Vector3.Lerp (_cube.transform.position, _cube.transform.position + dir, Time.deltaTime * _speed);
// if cube is close to end point, reset
if (Vector3.Distance(_endPos, _cube.transform.position) <= (dir * Time.deltaTime * _speed).magnitude)
{
ResetCube();
}
}
//Resets ships positions and give him a random destination
private void ResetCube()
{
_startPos = new Vector3(4.5f, 0.0f, Random.Range(-4.5f, 4.5f));
_endPos = _startPos;
_endPos.x *= -1.0f;
_endPos.z = Random.Range(-4.5f, 4.5f);
_cube.transform.position = _startPos;
}
private void Start ()
{
ResetCube();
}
}
Does anyone has an idea or how to solve this issue?
Comment
Your answer
![](https://koobas.hobune.stream/wayback/20220612122032im_/https://answers.unity.com/themes/thub/images/avi.jpg)