SebyLiberty
SebyLiberty

Reputation: 67

GameObject rotation based Vector2 direction

I apologize in advance for my english.

I have a 2D GameObject and i want to rotate it forward based on Vector2 direction.

my arrow right now:

https://streamable.com/7kmtig

i would like this:

enter image description here enter image description here

This code rotates arrow:

float angle = Mathf.Atan2(p.direction.y, p.direction.x) * Mathf.Rad2Deg;
punta.transform.rotation = Quaternion.AngleAxis(angle, -Vector3.forward);

punta is arrow GameObject

I created 2 scripts: PlayerController:

using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public Camera cam;
    Vector2 coordinate2D;
    public bool direziona = false;
    public Rigidbody2D rb;
    public Vector2 direction;
    public Vector2 mousePotion;
    public float distanza;
    // Start is called before the first frame update
    void Start()
    {
        direction = Vector2.zero;
        mousePotion = Vector2.zero;
        distanza = 0;
        rb = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {

        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);

            if (hit.collider != null)
            {
                direziona = true;
            }
        }
        if (direziona)
        {
            mousePotion = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            direction = new Vector2(transform.position.x - mousePotion.x, transform.position.y - mousePotion.y).normalized;
            distanza = Mathf.Clamp(Vector2.Distance(mousePotion, transform.position) * 5, 0, 12);
            direction = direction * distanza;
            if (Input.GetMouseButtonUp(0))
            {
                rb.AddForce(direction, ForceMode2D.Impulse);
                direziona = false;

            }
        }
    }
}

DragLineController:

using System.Collections;
using System.Collections.Generic;
using System.Linq.Expressions;
using TMPro;
using UnityEngine;

public class DragLineController : MonoBehaviour
{
    // Start is called before the first frame update
    public GameObject player;
    public GameObject punta; //sprite arrow
    bool ClickPlayer;
    LineRenderer _lineRender;
    Vector2 startPoint;
    Vector2 endPoint;
    PlayerController p;
    void Start()
    {
        p = player.GetComponent<PlayerController>();
        _lineRender = GetComponent<LineRenderer>();
        _lineRender.SetPosition(0, Vector3.zero);
        _lineRender.SetPosition(1, Vector3.zero);

    }

    // Update is called once per frame
    void Update()
    {
        ClickPlayer = player.GetComponent<PlayerController>().direziona;
        if (ClickPlayer)
        {
            startPoint = player.transform.position;
            _lineRender.SetPosition(0, startPoint);
            float dist =Mathf.Clamp(p.distanza,0,0.3f);
            Debug.Log(dist);
            endPoint = startPoint + (p.direction * dist);
            _lineRender.SetPosition(1, endPoint);
            Vector3 FracciaEndPoint = new Vector3(endPoint.x, endPoint.y, -1);
            //punta.transform.rotation = Quaternion.LookRotation(p.direction);
            punta.transform.position = FracciaEndPoint;
            float angle = Mathf.Atan2(p.direction.y, p.direction.x) * Mathf.Rad2Deg;
            punta.transform.rotation = Quaternion.AngleAxis(angle, -Vector3.forward);

        }
        else
        {
            _lineRender.SetPosition(0, Vector3.zero);
            _lineRender.SetPosition(1, Vector3.zero);
        }
    }
}

Thanks in advance for your availability.

Upvotes: 1

Views: 5204

Answers (1)

derHugo
derHugo

Reputation: 90659

Instead of calculating the rotation for

punta.transform.rotation = Quaternion.AngleAxis(angle, -Vector3.forward);

you could instead simply assign the according axis (I assume the point looks in its Y direction)

punta.transform.up = p.direction;

or .right if instead it points in its local X direction.

Upvotes: 1

Related Questions