Поверните RigidBody2d в сторону MousePos - Корреляционный элемент <-> Child? - PullRequest
0 голосов
/ 23 апреля 2020

Intro : Итак, я хочу сделать 2D Topdown Shooter. Игрок должен быть в состоянии двигаться, и у него есть «BullerShoter», который может быть продуман до оружия, который стреляет пулями из своего положения в направлении мыши

Моя цель : Возможность стрелять в сторону MousePosition при перемещении

Настройка : 1x GameObject -> Player (родитель, может перемещаться через WASD)

1x GameObject -> BulletShooter (Child of Игрок, отслеживает mousePos, это RigidBody2D.rotation установлен на вычисленный угол к MousePos)

Logi c: получить положение мыши и преобразовать его в World Space Coords, вычислить Угол от BullertShooter до этих Координат, установите значение BulbShooter's'sbsBody.rotation = angle

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

public class BulletShooter : MonoBehaviour
{
    PlayerInputAction inputAction;
    public GameObject bulletPrefab;
    private Rigidbody2D rb;
    private Vector2 mousePos;
    private Vector2 mousePosInWorld;

    private void Awake()
    {
        inputAction = new PlayerInputAction();
        inputAction.PlayerControls.Look.performed += ctx => mousePos = ctx.ReadValue<Vector2>();
        inputAction.PlayerControls.Shoot.performed += ctx => shoot();
        rb = gameObject.GetComponent<Rigidbody2D>();
    }

    private void shoot()
    {
        GameObject projectile = (GameObject) Instantiate(bulletPrefab, gameObject.transform.position, gameObject.transform.rotation);
    }

    void Update()
    {
        mousePosInWorld = Camera.main.ScreenToWorldPoint(mousePos);
    }

    void FixedUpdate()
    {
        Vector2 lookDir = mousePosInWorld - rb.position;
        float angle = Mathf.Atan2(lookDir.y, lookDir.x) * Mathf.Rad2Deg - 90f;
        Debug.Log("Rotation before:" + rb.rotation);
        Debug.Log("Angle: " + angle); // Assuming the gameObject (BulletShooter)
        rb.rotation = angle;
        Debug.Log("Rotation after:" + rb.rotation); // 
    }

    private void OnEnable()
    {
        inputAction.Enable();
    }

    private void OnDisable()
    {
        inputAction.Disable();
    }

}

Проблема : BulletShooter будет вращаться только тогда, когда игрок не двигается.

Мой тезис: Существует корреляция между вращением игрока и вращением BulletShooter.

Мой обходной путь : Если я позволю BulletShooter БЫТЬ игрой er -> только 1 GameObject, который обрабатывает все, он работает как шарм. Но я хочу 2 GameObjects, 1 для движения, другой для прицеливания и стрельбы

enter image description here

Вопрос : Как можно При вращении Родителя я поворачиваю Ребёнка, не устанавливая его вращение на вращение Родителя.

1 Ответ

0 голосов
/ 23 апреля 2020

Это зависит от того, где у вас есть компонент Rigidbody. Я бы предположил только на родителя. В противном случае физическая система заставляет ребенка двигаться в основном свободно.

При настройке вращения и положения на Rigidbody2D это всегда координаты мирового пространства. Вращение игнорирует любых родителей.

При прикосновении к компоненту Transform (не рекомендуется, если Rigidbody использует физику), тогда у вас есть настройки как в мировом, так и в локальном пространстве. Прикосновение к position и rotation установит мировые координаты, снова игнорируя родителей. Установка localPosition или localRotation установит дочерний элемент относительно его родителя.

Но родительский элемент, который вращается сам, возьмет с собой своих дочерних элементов (если они не являются твердыми телами с собственным физическим движением).

Мне кажется странным, что ваше вращение не работает во время движения. Возможно ли, что вы касаетесь Transform.position здесь вместо использования Rigidbody2D.MovePosition ()?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...