Чем я должен заменить dirX, чтобы мои пули стреляли направо и налево - PullRequest
0 голосов
/ 19 марта 2020

Я играю в двумерную игру и хочу знать, как я могу стрелять пулями вправо и влево. В этот момент пули go чуть левее, даже если мой игрок двигается вправо. Как я могу заставить их стрелять в обе стороны или стрелять, только когда они находят объект, помеченный как «враг»

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

public class Character : MonoBehaviour
{

    Rigidbody2D rb;
    float dirX;

    [SerializeField]
    float moveSpeed = 5f, jumpForce = 400f, bulletSpeed = 500f;


    Vector3 localScale;

    public Transform barrel;
    public Rigidbody2D bullet;

    // Use this for initialization
    void Start()
    {
        localScale = transform.localScale;
        rb = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        dirX = CrossPlatformInputManager.GetAxis("Horizontal");

        if (CrossPlatformInputManager.GetButtonDown("Jump"))
            Jump();

        if (CrossPlatformInputManager.GetButtonDown("Fire1"))
            Fire();
    }

    void FixedUpdate()
    {
        rb.velocity = new Vector2(dirX * moveSpeed, rb.velocity.y);
    }





    void Jump()
    {
        if (rb.velocity.y == 0)
            rb.AddForce(Vector2.up * jumpForce);
    }

    void Fire()
    {
        var firedBullet = Instantiate(bullet, barrel.position, barrel.rotation);
        firedBullet.AddForce(barrel.up * bulletSpeed);
    }

}

1 Ответ

0 голосов
/ 19 марта 2020

Вы уже учитываете направление ствола. Вам просто нужно изменить направление ствола при перемещении.

Один из способов сделать это - установить непосредственно:

    // Update is called once per frame
    void Update()
    {
        dirX = CrossPlatformInputManager.GetAxis("Horizontal");
        if (dirX !=0)
        {
            barrel.up = Vector3.right * Mathf.Sign(dirX);
        }

        if (CrossPlatformInputManager.GetButtonDown("Jump"))
            Jump();

        if (CrossPlatformInputManager.GetButtonDown("Fire1"))
            Fire();
    }

Если ствол является дочерним элементом игрока объект, затем изменяя вращение персонажа, так что направление ствола в правильном направлении также будет работать. В этом вопросе недостаточно информации, чтобы знать наверняка, но, возможно, использование Quaternion.LookRotation для установки поворота персонажа так будет работать:

    // Update is called once per frame
    void Update()
    {
        dirX = CrossPlatformInputManager.GetAxis("Horizontal");
        if (dirX !=0)
        {
            Vector3 newPlayerForward = Vector3.forward * Mathf.Sign(dirX);

            transform.rotation = Quaternion.LookRotation(newPlayerForward, Vector3.up);
        }

        if (CrossPlatformInputManager.GetButtonDown("Jump"))
            Jump();

        if (CrossPlatformInputManager.GetButtonDown("Fire1"))
            Fire();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...