tigrev
tigrev

Reputation: 67

Unity - problem with arms rotation and flip, body flip and shotting - 2d shooter

I'm starting out with a small shooting game but I have a problem with my character. The arms have to rotate 360º but the body only right or left (depending on where the rotation of the arms by the mouse).

What I got so far is what you see in the video below but I have two big problems and with the help of tutorials.

Is this approach that I have tried is not the best for this problem?

I appreciate your help.

Game link: https://vimeo.com/310853740

Here my arm rotation script:

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

public class ArmRotation : MonoBehaviour
{
    SpriteRenderer spriteRend;

    void Awake()
    {
        spriteRend = GetComponent<SpriteRenderer>();
    }

    void Update()
    {
        AimArmAtMouse();
    }

    void AimArmAtMouse()
    {
        Vector2 mousePosition = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);  
        Vector2 armToMouse = mousePosition - (Vector2)transform.position;
        float rotationZ = Vector2.SignedAngle(transform.right, armToMouse);  
        transform.Rotate(0f, 0f, rotationZ);  
        FlipArm(Vector2.SignedAngle(transform.right, Vector2.right));
    }

    void FlipArm(float rotation)
    {
        if (rotation < -90f || rotation > 90f)
        {
            spriteRend.flipY = true;
        }
        else
        {
            spriteRend.flipY = false;
        }
    }
}

Upvotes: 1

Views: 1636

Answers (2)

tigrev
tigrev

Reputation: 67

@Sean, I separated the main_body from the arms and made a new script just for body rotation but now it happens to me this:

My test char

The code:

void Update()
{
    Flip();
}

void Flip() 
{
    Vector3 theScale = transform.localScale;
    Vector3 pos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0);
    float WorldXPos = Camera.main.ScreenToWorldPoint(pos).x; 

    if (WorldXPos > gameObject.transform.position.x)
    {
        theScale.x = 1;
        transform.localScale = theScale;
    }
    else
    {
        theScale.x = -1;
        transform.localScale = theScale;
    }
}}

Almost there but not yet i need😁

Upvotes: 0

Sean Carey
Sean Carey

Reputation: 807

It's because you don't flip the firepoint when you flip the sprite. enter image description here I re-wrote you script to include a reference to the firepoint. I also added a 'FlipFirePoint' function which gets called by your 'FlipArm' function. It should fix your alignment issue.

using UnityEngine;

public class ArmRotation : MonoBehaviour
{
SpriteRenderer spriteRend;
public Transform firePoint;

void Awake()
{
    spriteRend = GetComponent<SpriteRenderer>();
}

void Update()
{
    AimArmAtMouse();
}

void AimArmAtMouse()
{
    Vector2 mousePosition = (Vector2)Camera.main.ScreenToWorldPoint(Input.mousePosition);
    Vector2 armToMouse = mousePosition - (Vector2)transform.position;
    float rotationZ = Vector2.SignedAngle(transform.right, armToMouse);
    transform.Rotate(0f, 0f, rotationZ);
    FlipArm(Vector2.SignedAngle(transform.right, Vector2.right));
}

void FlipArm(float rotation)
{
    if (rotation < -90f || rotation > 90f)
    {
        spriteRend.flipY = true;
        FlipFirePoint(true);
    }
    else
    {
        spriteRend.flipY = false;
        FlipFirePoint(false);
    }
}

void FlipFirePoint(bool flip)
{
    var pos = firePoint.localPosition;
    pos.x = Mathf.Abs(pos.x) * (flip ? -1 : 1);
    firePoint.localPosition = pos;
}

}

Upvotes: 2

Related Questions