Piotr Kielan
Piotr Kielan

Reputation: 21

Vector2.MoveTowards -- Move To Target Position and Some More

I almost created game but there is one thing which is hard for me. I want to move player to target and some more.

The red dot is the goal, but I want to move the player to the goal and a little further.

P.S If the player goes to the right then I want him to reach the goal and a little further to the right

same to the left, top, bottom

Look Attachment: https://i.sstatic.net/7htWB.jpg Red dot is a target but i want player move to target and else more on the facing side (green dot)

i tried something like move forward but i dont have any idea.

    void Start()
    {

    }

    void Update()
    {
        target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
        transform.position = Vector2.MoveTowards(transform.position, target.position, (speed * Time.deltaTime));
    }
    //Mob have "Player" TAG (Player is not a player) |Targeting is fine|

Upvotes: 2

Views: 2865

Answers (1)

derHugo
derHugo

Reputation: 90659

You could add an offset value

// ajdust this in the inspector
public float offset = 0.1f;

and than add it to the position in the direction from the player to the target. As Foggzie mentioned this might not be a copy-past-able code yet since there might occure some hickups. To atleast prevent that the player turn around after overshooting the target and move back and forth you could use a setter method to get the direction only once:

public float offset;
public float threshold = 0.0001f;
public float speed;

private GameObject target;
private Vector3 direction;
private Vector3 targetPosition;

public void SetTarget(GameObject newTarget)
{
    target = newTarget;

    // adding the offset in that direction
    targetPosition = target.transform.position + direction * offset;

    // direction from the player to the target
    direction = (target.transform.position - transform.position).normalized;
}

private void Update()
{
    if (!target) return;

    // make Player overshoot the target by offset
    transform.position = Vector2.MoveTowards(transform.position, targetPosition, (speed * Time.deltaTime));

    // stop if target is reached
    if (Vector3.Distance(transform.position, targetPosition) <= threshold)
    {
        target = null;
    }
}

I don't know when and how you change the target so currently it doesn't limit the player movement to only X and Y like in your pictures ... but you would than do e.g.

// Note that 'transform' is a built-in property of 'GameObject' and you shouldn't use `GetComponent` for it
SetTarget(GameObject.FindGameObjectWithTag("Player").transform);

enter image description here

Upvotes: 2

Related Questions