Единство - проблема с поворотом и переворотом рук, переворотом тела и выстрелами - 2-й шутер

Я начинаю с небольшой стрелялки, но у меня есть проблема с моим персонажем. Руки должны вращаться на 360º, но тело должно быть направо или налево (в зависимости от того, где происходит вращение рук мышью).

То, что я получил так далеко, это то, что вы видите в видео ниже, но у меня есть две большие проблемы и с помощью учебников.

  • Я мог вращать и переворачивать руки, но не тело.

  • Кроме того, когда он стреляет направо, пули правильно выходят из созданной мною огневой точки, но после того, как руки перевернулись влево, пули (и огонь оружия) больше не выровнены.

Разве этот подход, который я пробовал, не является лучшим для этой проблемы?

Я ценю вашу помощь.

Ссылка на игру: https://vimeo.com/310853740

Вот мой скрипт поворота руки:

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;
        }
    }
}

2 ответа

Решение

Это потому, что вы не переворачиваете пожарную точку, когда вы переворачиваете спрайт. Я переписал ваш сценарий, чтобы включить ссылку на пожарную точку. Я также добавил функцию FlipFirePoint, которая вызывается вашей функцией FlipArm. Это должно исправить вашу проблему с выравниванием.

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;
}

}

@Sean, я отделил main_body от рук и сделал новый скрипт только для вращения тела, но теперь со мной это происходит так:

Мой тестовый персонаж

Код:

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;
    }
}}

Почти там, но пока не нужно

Другие вопросы по тегам