Единство - проблема с поворотом и переворотом рук, переворотом тела и выстрелами - 2-й шутер - PullRequest
0 голосов
/ 14 января 2019

Я начинаю с небольшой стрелялки, но у меня проблема с моим персонажем. Руки должны вращаться на 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 ]

0 голосов
/ 16 января 2019

@ Шон, я отделил тело 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;
    }
}}

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

0 голосов
/ 15 января 2019

Это потому, что вы не переворачиваете пожарную точку, когда переворачиваете спрайт. enter image description here Я переписал ваш сценарий, чтобы включить ссылку на пожарную точку. Я также добавил функцию 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;
}

}
...