2D стрельба

Программирование на Юнити.

2D стрельба

Сообщение kaleka 18 сен 2017, 09:11

Извиняюсь за глупый вопрос, но если у меня имеется враг-стрелок, он пускает стрелу, как стрела определяет направление того, кто ее пускает?
Методы из скрипта стрелка:
Синтаксис:
Используется csharp
//Нанесение урона
        void StartDamage () {
                moveSpeedDirection = Mathf.Sign (transform.position.x - player.transform.position.x);
                moveSpeed = Mathf.Lerp (0f, 0.1f, Time.deltaTime);
                StartCoroutine ("Attacking");
        }


        //Нанесение урона
        IEnumerator Attacking () {
                animator.SetBool ("attack", true);
                yield return new WaitForSeconds (0.3f);
                animator.SetBool ("attack", false);
                yield return new WaitForSeconds (0.5f);
                CreateArrow ();
                Debug.Log ("Выстрел");
        }

        public void CreateArrow() {
                Vector3 velo = new Vector3 (tran.position.x, tran.position.y + 0.8f, tran.position.z);
                Instantiate (arrow, velo, Quaternion.identity);
        }


Скрипт стрелы:
Синтаксис:
Используется csharp
[RequireComponent(typeof (Controller2D))]
public class Arrow: MonoBehaviour {

        Vector3 velocity;
        float direction;
        public float moveSpeed;
        Controller2D controller;

        bool Check;

        GameObject archer;

        private bool isFacingRight = true;

        void Awake () {
                StartCoroutine ("Pause");

                archer = GameObject.Find ("Archer");
                direction = archer.GetComponent<Archer> ().moveSpeedDirection;
                velocity.x = Vector2.right.x * moveSpeed * direction;
        }

        void Update() {

                if (velocity.x > 0 && !isFacingRight)
                        //отражаем персонажа вправо
                        Flip ();
                //обратная ситуация. отражаем персонажа влево
                else if (velocity.x < 0 && isFacingRight)
                        Flip ();

                transform.Translate (velocity);
        }

        private void Flip()
        {
                //меняем направление движения персонажа
                isFacingRight = !isFacingRight;
                //получаем размеры персонажа
                Vector3 theScale = transform.localScale;
                //зеркально отражаем персонажа по оси Х
                theScale.x *= -1;
                //задаем новый размер персонажа, равный старому, но зеркально отраженный
                transform.localScale = theScale;
        }

        IEnumerator Pause() {
                yield return new WaitForSeconds (5f);
                Destroy (gameObject);
        }
}


Если на сцене всего один враг-стрелок, то данная схема работает, а если много врагов и все они патрулируют в разных направлениях, то конечно это не катит. Как сделать правильно?
Последний раз редактировалось kaleka 18 сен 2017, 16:01, всего редактировалось 1 раз.
kaleka
UNец
 
Сообщения: 15
Зарегистрирован: 05 июл 2017, 21:29

Re: 2D стрельба

Сообщение snezhok_13 18 сен 2017, 10:16

Например каждый Archer имеет скрипт вроде такого:

в классе Archer
Синтаксис:
Используется csharp
void CastArrow(Vector3 direction)
{
     GameObject arrowGo = Instantiate(...);
     Arrow arrow = arrowGo.GetComponent<Arrow>();
     arrow.SetCaster(this);
}
Разработка игр, немножко игровая журналистика, сейчас делаем Календарь: даты выхода игр
Аватара пользователя
snezhok_13
UNIверсал
 
Сообщения: 450
Зарегистрирован: 09 сен 2013, 11:12
Skype: s.coremission
  • Сайт

Re: 2D стрельба

Сообщение kaleka 18 сен 2017, 15:58

snezhok_13 писал(а):Например каждый Archer имеет скрипт вроде такого:

в классе Archer
Синтаксис:
Используется csharp
void CastArrow(Vector3 direction)
{
     GameObject arrowGo = Instantiate(...);
     Arrow arrow = arrowGo.GetComponent<Arrow>();
     arrow.SetCaster(this);
}


Ммм, а что делает последняя строчка?
kaleka
UNец
 
Сообщения: 15
Зарегистрирован: 05 июл 2017, 21:29

Re: 2D стрельба

Сообщение kaleka 18 сен 2017, 16:03

Сорре, затупил, в первом сообщении 2 одинаковых куска вставил. Посмотрите еще раз методы из скрипта Archer
kaleka
UNец
 
Сообщения: 15
Зарегистрирован: 05 июл 2017, 21:29

Re: 2D стрельба

Сообщение snezhok_13 18 сен 2017, 18:12

kaleka писал(а):Сорре, затупил, в первом сообщении 2 одинаковых куска вставил. Посмотрите еще раз методы из скрипта Archer

Последнее это метод который вы сами напишите. В нем в поле стрелы вы записываете того, кто ее выпустил.
И дальше не нужно искать по имени, у вас будет поле с ссылкой на стрелка
Разработка игр, немножко игровая журналистика, сейчас делаем Календарь: даты выхода игр
Аватара пользователя
snezhok_13
UNIверсал
 
Сообщения: 450
Зарегистрирован: 09 сен 2013, 11:12
Skype: s.coremission
  • Сайт

Re: 2D стрельба

Сообщение kaleka 19 сен 2017, 08:10

Большое спасибо, разобрался, тему можно закрывать

Вот скрипт для стрелы:
Синтаксис:
Используется csharp
[RequireComponent(typeof (Controller2D))]
public class Arrow: MonoBehaviour {

        Vector3 velocity;
        public float moveSpeed;
        Controller2D controller;

        bool Check;

        GameObject archer;

        private bool isFacingRight = true;

        void Awake () {
                StartCoroutine ("Pause");
        }

        void Update() {

                if (velocity.x > 0 && !isFacingRight)
                        //отражаем персонажа вправо
                        Flip ();
                //обратная ситуация. отражаем персонажа влево
                else if (velocity.x < 0 && isFacingRight)
                        Flip ();

                transform.Translate (velocity);
        }

        private void Flip()
        {
                //меняем направление движения персонажа
                isFacingRight = !isFacingRight;
                //получаем размеры персонажа
                Vector3 theScale = transform.localScale;
                //зеркально отражаем персонажа по оси Х
                theScale.x *= -1;
                //задаем новый размер персонажа, равный старому, но зеркально отраженный
                transform.localScale = theScale;
        }

        IEnumerator Pause() {
                yield return new WaitForSeconds (5f);
                Destroy (gameObject);
        }

        public void SetCaster(Archer archer) {
                float direction = archer.moveSpeedDirection;
                velocity.x = Vector2.left.x * moveSpeed * direction;
        }
}


Кусок из скрипта лучника c методами на атаку:
Синтаксис:
Используется csharp
//Нанесение урона
        void StartDamage () {
                moveSpeedDirection = Mathf.Sign (transform.position.x - player.transform.position.x);
                moveSpeed = Mathf.Lerp (0f, 0.1f, Time.deltaTime);
                StartCoroutine ("Attacking");
        }


        //Нанесение урона
        IEnumerator Attacking () {
                animator.SetBool ("attack", true);
                yield return new WaitForSeconds (0.3f);
                animator.SetBool ("attack", false);
                yield return new WaitForSeconds (0.5f);
                CreateArrow (new Vector3 (tran.position.x, tran.position.y + 0.8f, tran.position.z));
                Debug.Log ("Выстрел");
        }

        public void CreateArrow(Vector3 direction) {
                GameObject arrowInstance = Instantiate (arrow, direction, Quaternion.identity);
                Arrow arrowScript = arrowInstance.GetComponent<Arrow> ();
                arrowScript.SetCaster (this);
        }
kaleka
UNец
 
Сообщения: 15
Зарегистрирован: 05 июл 2017, 21:29


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: GoGo.Ru [Bot] и гости: 13