CXO2
CXO2

Reputation: 648

Applying direction into current transform position

I'm not quite sure whether I pick correct title for the question, feel free to edit it If you find it misleading.

I'm developing an action game which involving music as the core of its gameplay. It contains a set of entities (game objects) that move into several directions; top, right, left, bottom and diagonal moves (e.g: top-left, top-right, bottom-left, etc etc).

To determine the position of these entities, there is a value which need to be calculated that involving the music tempo and several properties of the entities itself, which I able produce it in Unity.

I use following function to determine the position of transform of the entities:

    private Vector3 _position;

    private void DeterminePosition(float offset)
    {
        // In actual code, the _position is initialized under Start() method
        // But for this simplification sake, I'll just put it here
        _position = _position == null ? new Vector3(0, 0, 1f) : _position;

        if (Direction == Direction.Up || Direction == Direction.RightUp || Direction == Direction.LeftUp)
        {
            _position.y = offset;
        }
        if (Direction == Direction.Down || Direction == Direction.RightDown || Direction == Direction.LeftDown)
        {
            _position.y = -offset;
        }
        if (Direction == Direction.Left || Direction == Direction.LeftDown || Direction == Direction.LeftUp)
        {
            _position.x = -offset;
        }
        if (Direction == Direction.Right || Direction == Direction.RightDown || Direction == Direction.RightUp)
        {
            _position.x = offset;
        }

        transform.position = _position;
    }

Where the offset is the value that I was talking about before.

The code works perfectly as intended, however the game need to be change. Instead of fixed direction (e.g: Up, Right, Left, Bottom, RightUp, DownLeft etc etc) we decide to use value of degree for the direction (0 to 360 degree).

And now I've no idea how to impement this. I've tried to use following codes, but it doesn't work:

    _position = new Vector3(offset, offset, transform.position.z);

    // Where the direction is between 0 .. 360
    transform.position = Quaternion.Euler(0, direction, 0) * _position;

Can anybody else come up with solution?
Thanks in advance!

Upvotes: 1

Views: 876

Answers (1)

Poosh
Poosh

Reputation: 542

If offset represents the distance from the new position to (0, 0, transform.position.z) (calling that the origin since only x and y positions seem to change), and direction is the angle measured counterclockwise in degrees between the positive x-axis and the vector from the origin to the the new position, you can get the new x and y positions using offset and sin and cos of the direction:

_position.x = offset * Mathf.Cos(Mathf.Deg2Rad * direction);
_position.y = offset * Mathf.Sin(Mathf.Deg2Rad * direction);
_position.z = transform.position.z; //assuming the z position stays the same
transform.position = _position;

Edit

To account for scaling, I think you will need to replace offset depending on the direction.

float multiplier = 0f;
if(0 <= direction && direction <= 45)
{
    multiplier = Mathf.Abs(offset / Mathf.Cos(Mathf.Deg2Rad * direction));
}
else if(45 < direction && direction <= direction <= 135)
{
    multiplier = Mathf.Abs(offset / Mathf.Sin(Mathf.Deg2Rad * direction));
}
else if(135 < direction && direction <=225)
{
    multiplier = Mathf.Abs(offset / Mathf.Cos(Mathf.Deg2Rad * direction));
}
else if(225 < direction && direction <= 315)
{
    multiplier = Mathf.Abs(offset / Mathf.Sin(Mathf.Deg2Rad * direction));
}
else if(315 < direction && direction <= 360)
{
    multiplier = Mathf.Abs(offset / Mathf.Cos(Mathf.Deg2Rad * direction));
}

_position.x = multiplier * Mathf.Cos(Mathf.Deg2Rad * direction);
_position.y = multiplier * Mathf.Sin(Mathf.Deg2Rad * direction);
_position.z = transform.position.z;
transform.position = _position;

This will break the coordinate plane into 4 90-degree sections (if you combine 315 < direction <= 360 and 0 <= direction < 45) where you are using sin or cos of direction to create a multiplier that should account for the regions where offset needs to be scaled depending on x and y components of the displacement.

Upvotes: 1

Related Questions