xercool
xercool

Reputation: 943

Unity: Special movement for game

I'm writing movement for my space game and spaceship object (player) with mouse cursor.

Currently have following code:

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;

public class Move : MonoBehaviour {

    public float speed = 1.5f;
    public float rotationSpeed = 90f;
    public float rotPrecision = 0.1f;
    public float movePrecision = 0.1f;
    private Vector3 pos;
    private Quaternion qTo;

    void Start () {
        pos = transform.position;
        qTo = transform.rotation;
    }

    void Update () {
        if (!EventSystem.current.IsPointerOverGameObject())
        {

            if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0))
            {
                pos = Input.mousePosition;
                pos.z = transform.position.z - Camera.main.transform.position.z;
                pos = Camera.main.ScreenToWorldPoint(pos);
            }

            var dir = pos - transform.position;
            qTo = Quaternion.LookRotation(Vector3.forward, pos - transform.position);

            if (Quaternion.Angle(transform.rotation, qTo) >= rotPrecision) //just set your own precision
                transform.rotation = Quaternion.RotateTowards(transform.rotation, qTo, Time.deltaTime * rotationSpeed);

            if (Vector3.Distance(transform.position, pos) > movePrecision) // 0.1f
                transform.Translate(Vector3.up * speed * Time.deltaTime);
        }
    }    

}

But there i have the problem with the movement precision and rotation when the point is too close to player (have infinite loop).

The idea of this movement system described with the following image:

(Player actor is green, path is gray, and destination point is red).

movement plan

I hope that somebody could help me w/ that.

Thank you!

Upvotes: 0

Views: 72

Answers (1)

Doh09
Doh09

Reputation: 2385

If I understand your question correctly, the problem is that the player's movement never stops as the code can't reach a finishing point.

To solve this you can add an acceptable precision margin.

So calculate if the difference between the rotation you wish or the movement you wish, and the players actual rotation/position, is less than a given variable, for example less than 0.05%.

That way you could allow the program to know that if it's just within 0.05% precision, then it's okay for it to stop moving.

Otherwise, if the program never reaches a complete and perfect rotation and position, it will continue to adjust endlessly due to slight mathematical imprecision in the calculations and movement pattern.

Upvotes: 1

Related Questions