Четверг, 26 Декабря 2024, 05:57

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Поворот и направление движения 2D
VostruginДата: Пятница, 26 Февраля 2016, 22:13 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Добрый вечер.
Имею следующую структуру:
- Объект, который передвигается. Не вращается. Ходовая часть.
-- Объект, который вращается за курсором. Пушка.
--- Объект, который служит фабрикой объектов (инициализирует объекты снарядов).
Исходя из логики вещей снаряды должны лететь в сторону поворота пушки на момент выстрела. Раньше движение было реализовано с помощью AddForce, теперь хочу переделать на ручное управление transform. Но столкнулся с тем, что при манипуляции с transform снаряды двигаются в непонятном для меня направление.
Подскажите пожалуйста, где моя ошибка? Чего я не понимаю?

GunBase.cs (Пушка)
Код

using UnityEngine;
using System.Collections;

public class GunBase : MonoBehaviour {

    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
        var target = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector3 diff = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
        diff.Normalize();
        float rotZ = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
        transform.rotation = Quaternion.Euler(0f, 0f, (rotZ + 90));
    }
}


GunFire.cs (Место спавна снарядов)
Код

using UnityEngine;
using System.Collections;

public class GunFire : MonoBehaviour {
    public GameObject Bullet;

    // Use this for initialization
    void Start () {
    }
    
    // Update is called once per frame
    void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            var bullet = (GameObject)Instantiate(Bullet, transform.position, Quaternion.identity);
            bullet.transform.up = transform.up;
            var lineBullet = bullet.GetComponent<LineBullet>();
            lineBullet.SetMovement(new LinerMovement());
            lineBullet.IsEnemy = false;
        }
    }
}


Реализация движения снаряда
Код

using UnityEngine;
using System.Collections;

public class LinerMovement : IMovement {
    bool IsAlreadyFired = false;

    public void Move(GameObject entity)
    {
        if (!IsAlreadyFired)
        {
            entity.transform.Translate(entity.transform.up * Time.deltaTime); // не понятное направление
            //entity.GetComponent<Rigidbody2D>().AddForce(entity.transform.up * 1000); // всё работает как нужно
            //IsAlreadyFired = true;
        }
    }
}




VerdCSДата: Пятница, 26 Февраля 2016, 23:24 | Сообщение # 2
частый гость
Сейчас нет на сайте
Не знаю как у вас реализован интерфейс. Добавьте скрип, в качестве компонента, к пуле.

Код
using UnityEngine;
using System.Collections;

public class LinerMovement : MonoBehaviour, IMovement {
    bool IsAlreadyFired = false;

    public void Move(GameObject entity)
    {
        if (!IsAlreadyFired)
        {
            
            //entity.transform.Translate(entity.transform.up * Time.deltaTime); // не понятное направление
            //entity.GetComponent<Rigidbody2D>().AddForce(entity.transform.up * 1000); // всё работает как нужно
            //IsAlreadyFired = true;
        }
    }
    void Update () {
      transform.position += transform.up * Time.deltaTime;
    }
}


Сообщение отредактировал VerdCS - Пятница, 26 Февраля 2016, 23:36
VostruginДата: Суббота, 27 Февраля 2016, 12:04 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
VerdCS, сегодня со свежей головой попробовал твой вариант - работает. Я пробовал до этого так сделать, но видимо где-то ещё устанавливал неправильный поворот пули. Спасибо тебе большое!;)



  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг