У меня проблема с инстанцированием направления и смещения - PullRequest
1 голос
/ 22 сентября 2019

У меня есть 2D персонаж в 8 направлениях, и он стреляет снарядом в позиции мыши.Я хочу выстрелить этим снарядом в позиции мыши, но со смещением по оси Y в начальной точке.Было бы легко, если бы я мог просто обойти это с помощью sprite pivot или чего-то еще, но, к сожалению, я не могу себе этого позволить, и мне нужно исправить это по-другому.Проверьте изображение по ссылке

(A). Для этого я использовал этот код, и, поскольку стержень объекта находится вокруг его ног, он ведет себя так, как на изображении.

Vector3 MousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 direction = (Vector2)((MousePos - transform.position));
direction.Normalize();

GameObject bullet = (GameObject)Instantiate(
    bullet1,
    new Vector3(transform.position.x, transform.position.y, transform.position.z) + (Vector3)((direction) * 0.05f),
    Quaternion.Euler(0, 0, shootRotation));

i 'Я перемещаю этот экземпляр объекта с помощью

bullet.GetComponent<Rigidbody2D>().velocity = direction * speed

Но это не работает, как я хочу, потому что снаряд стреляет из пояса персонажа.

(B), поэтому я попытался добавить + 0,35f кtransform.position.y, и какое-то время это работало, пока я не заметил, что смещение также влияет на точку приземления, поэтому он не стреляет в реальном положении мыши

1 Ответ

1 голос
/ 22 сентября 2019

Прежде всего вы можете резко сократить свой код.Есть несколько ненужных типов и векторов.

В)

Когда вы вычисляете направление в зависимости от transform.position, но позже создаете экземпляр пули, используя transform.position + Vector3.up * 0.35f, это значение смещения также используется длянаправление, поэтому кажется, что ваша целевая позиция смещена вверх на ту же величину.

Вместо этого вычислите значение bulletOrigin, сначала добавив любое смещение спавна, а затем вычислите direction в соответствии с этим bulletOrigin вместоиспользуя transform.position.

// Instead of new Vector3(transfor.position.x, transform.position,y, transform.position.z)
// you can simply use transform.position
// Vector3 (and Vector2) is a struct -> value type
// a new Vector is created anyway by assigning it
var bulletOrigin = transfor.position /* + additionalOffsetVector */;
// add the offset here already so the direction is later calculated between
// the correct positions

var mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
// Vector3 and Vector2 are implicitely casted between each other
// You don't have to typecast everytime
var direction = (mousePos - bulletOrigin).normalized;

bulletOrigin += 0.05f * direction;

// You didn't tell us where shootRotation comes from but in general
// I would rather use this for the rotation so it simply faces with the forward
// vector in the direction
var bulletRotation = Quaternion.LookRotation(direction, Vector3.forward);

var bullet = Instantiate(bullet1, bulletOrigin, bulletRotation);
// Latest here the direction is automatically used as Vector2
bullet.GetComponent<Rigidbody2D>().velocity = direction * speed;

также см. Quaternion.LookRotation


Некоторые примечания относительно производительности:

  • Если вы предпочитаете сделать поле prefab типа

    public Rigidbody2D bullet1;
    

    , вы можете пропустить вызов GetComponent позже и просто использовать

    var bullet = Instantiate(bullet1, bulletOrigin, bulletRotation);
    bullet.velocity = direction * speed;
    
  • Camera.mainэто довольно дорого, и вы должны сделать это только один раз и сохранить ссылку.Либо уже через Inspector

    [SerializeField] private Camera mainCamera;
    

    , установив его в Awake при запуске игры

    private void Awake()
    {
        if(!mainCamera) mainCamera = Camera.main;
    }
    

    , либо в качестве крайней меры в тех случаях, когда вы создаете разные камеры (что на самом деле почти никогда неcase;)) прямо в вашем методе

    if(!mainCamera) mainCamera = Camera.main;
    var MousePos = mainCamera.ScreenToWorldPoint(Input.mousePosition);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...