41 / 4 / 0
Регистрация: 26.10.2018
Сообщений: 79
1

Движение врага в Unity 2D C#

26.10.2018, 10:18. Показов 38244. Ответов 14
Метки нет (Все метки)

Приветствую ! Такой интересный вопрос , делаю 2D игру на Unity , делаю врага … Есть сам игрок и спрайт врага , необходимо , чтобы враг двигался за игроком , когда игрок находится на определенной дистанции от врага … Скрипт накидал примерно … Надеюсь на вашу помощь , а то прошарил интернет вплоть до просто движения спрайта в Unity C# по Х

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Opponent_Game : MonoBehaviour {
 
    public GameObject hero;
    public GameObject opponent;
    public Rigidbody2D opponent_rb;
    public float opponent_speed = 20f;
    public float opponent_distance = 20f;
    public Transform waypointA, waypointB;
    public Vector3 direction;
    public Transform opponent_pos;
    private Vector3 player;
    
    void Start () {
        opponent = GameObject.FindWithTag("Opponent");
        hero = GameObject.FindWithTag("Player");
        opponent_rb = GetComponent<Rigidbody2D>();
    }
    
    void Update () {
        float moveX = Input.GetAxis("Horizontal");
 
        opponent = GameObject.FindWithTag("Opponent");
        hero = GameObject.FindWithTag("Player");
 
        if (opponent.transform.position.x + 20 <= hero.transform.position.x - 20) {
            player = opponent.transform.position;
            player.x = transform.position.x;
            transform.position = Vector3.MoveTowards(transform.position, player, opponent_speed * Time.deltaTime);
        }
 
        else if (opponent.transform.position.x - 20 >= hero.transform.position.x + 20) {
            player = opponent.transform.position;
            player.x = transform.position.x;
            transform.position = Vector3.MoveTowards(transform.position, player, opponent_speed * Time.deltaTime);
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2018, 10:18
Ответы с готовыми решениями:

Движение врага
Подскажите как решить такую проблему. Я создаю 2 точки на карте(2 куба ) на расстояние, и мне...

Движение врага
В общем, нужно, чтобы &quot;враг&quot; двигался от края платформы к краю. using UnityEngine; using...

Поворот врага в сторону главного героя в Unity 2D
Как сделать чтобы враг поворачивался в сторону игрока в 2д платформере? (Так как враг стреляет в...

Unity 2d: скрипт автоматического наведения оружия на врага
У меня есть скрипт на стрельбу и наведение на мышку, но мне хочется, чтоб оружие наводилось...

14
2966 / 1526 / 887
Регистрация: 26.10.2018
Сообщений: 4,376
26.10.2018, 16:39 2
Это можно выкинуть из апдейта.
C#
1
2
opponent = GameObject.FindWithTag("Opponent");
hero = GameObject.FindWithTag("Player");
Это вообще странный кусок кода.
C#
1
2
3
4
5
6
7
8
9
10
11
        if (opponent.transform.position.x + 20 <= hero.transform.position.x - 20) {
            player = opponent.transform.position;
            player.x = transform.position.x;
            transform.position = Vector3.MoveTowards(transform.position, player, opponent_speed * Time.deltaTime);
        }
 
        else if (opponent.transform.position.x - 20 >= hero.transform.position.x + 20) {
            player = opponent.transform.position;
            player.x = transform.position.x;
            transform.position = Vector3.MoveTowards(transform.position, player, opponent_speed * Time.deltaTime);
        }
Не проще ли узнать дистанцию по Х банальной разницей?
C#
1
2
3
4
5
6
if (Mathf.Abs(opponent.transform.position.x - hero.transform.position.x) < 20)
{
            player = opponent.transform.position;
            player.x = transform.position.x;
            transform.position = Vector3.MoveTowards(transform.position, player, opponent_speed * Time.deltaTime);
}
Само движение тоже можно сделать попроще...
0
41 / 4 / 0
Регистрация: 26.10.2018
Сообщений: 79
26.10.2018, 19:12  [ТС] 3
1max1 , не получилось ! В игроке и оппоненте(враге) по объекту сделал , к врагу скрипт присобачил , попробовал кинуть ссылку к скрипту на самого игрока и врага - не работает , попробовал на объект врага и игрока - так же не работает !
0
2966 / 1526 / 887
Регистрация: 26.10.2018
Сообщений: 4,376
26.10.2018, 19:50 4
Лучший ответ Сообщение было отмечено ILUNCHIK как решение

Решение

Вешай на врага.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class EnemyFollow : MonoBehaviour
{
    GameObject player;
 
    const float speedMove = 30.0f;
 
    void Start()
    {
        player = GameObject.FindWithTag("Player");
    }
 
    void Update()
    {
        float direction = player.transform.position.x - transform.position.x;
 
        if (Mathf.Abs(direction) < 20)
        {
            Vector3 pos = transform.position;
            pos.x += Mathf.Sign(direction) * speedMove * Time.deltaTime;
            transform.position = pos;
        }
    }
}
0
41 / 4 / 0
Регистрация: 26.10.2018
Сообщений: 79
27.10.2018, 08:00  [ТС] 5
1max1, спасибо , а то хотел уже концепцию проекта менять... И еще вопрос , при столкновении откидывать на малое расстояние врага и героя через Импульс или Силу на них ? Ну а жизни уж напишу ))))
0
2966 / 1526 / 887
Регистрация: 26.10.2018
Сообщений: 4,376
27.10.2018, 08:49 6
Цитата Сообщение от ILUNCHIK Посмотреть сообщение
Импульс или Силу
Не имеет особого значения, но я бы использовал импульс.
0
41 / 4 / 0
Регистрация: 26.10.2018
Сообщений: 79
29.10.2018, 13:24  [ТС] 7
1max1, еще вопрос, написал код для проверки столкновений, но не работает … Необходимо, чтобы при столкновении оппонента(тег Opponent) и игрока(тег Player) , если здоровье не закончилось , то враг отталкивается влево или вправо зависимо от его расположения относительно игрока и отнималось 10 здоровья , ну и соответственно с расположением , так же , но если здоровья 0 или меньше, то противник умирает … Только уничтожение объекта opponent(Opponent) не реализовал , так как столкновение не реализуется … Извини , что так туплю , просто в Unity я новичок полнейший , раньше только с консолями работал , максимум на окна заходил
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    void OnCollisionEnter(Collision col)
    {
        if (col.collider.tag == "Player" & hp >= 1) {
            hp -= 10;
            if (opponent.transform.position.x >= hero.transform.position.x)
                opponent_rb.AddForce(Vector2.right * 8000);
            if (opponent.transform.position.x <= hero.transform.position.x)
                opponent_rb.AddForce(Vector2.left * 8000);
        }
 
        if (col.collider.tag == "Player" & hp <= 0) {
            Debug.Log("Противник уничтожен (Должен быть)");
            if (opponent.transform.position.x >= hero.transform.position.x)
                opponent_rb.AddForce(Vector2.right * 8000);
            if (opponent.transform.position.x <= hero.transform.position.x)
                opponent_rb.AddForce(Vector2.left * 8000);
        }
        
    }
0
2966 / 1526 / 887
Регистрация: 26.10.2018
Сообщений: 4,376
29.10.2018, 13:35 8
Не понятно ничего, на ком висит этот скрипт? При столкновении у кого здоровье отнималось у игрока или врага?

Добавлено через 3 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void OnCollisionEnter(Collision col)
{
    if (col.collider.tag == "Player" & hp > 0) 
    {
        hp -= 10;
 
        if (hp <= 0) 
            Destroy(gameObject);
 
            if (opponent.transform.position.x > hero.transform.position.x)
                opponent_rb.AddForce(Vector2.right * 8000);
            else
                opponent_rb.AddForce(Vector2.left * 8000);
    }        
}
0
41 / 4 / 0
Регистрация: 26.10.2018
Сообщений: 79
29.10.2018, 14:14  [ТС] 9
1max1, скрипт повесил на врага , жизни должны отниматься у врага и откидывать нужно так же врага … И еще вопрос , возможно ли получить данные из другого скрипта или как получить данные другого объекта (например : переменные , box collider 2D) , к которому скрипт не привязан(Просто хочу доделать боевую систему , то есть сделать , чтобы игрока можно было убить ну и его тоже откидывало , может с игроком еще , что-то придумаю) ?
0
2966 / 1526 / 887
Регистрация: 26.10.2018
Сообщений: 4,376
29.10.2018, 14:40 10
Цитата Сообщение от ILUNCHIK Посмотреть сообщение
возможно ли получить данные из другого скрипта
col.gameObject.GetComponent
0
41 / 4 / 0
Регистрация: 26.10.2018
Сообщений: 79
29.10.2018, 17:08  [ТС] 11
1max1, Можно по подробнее ? Просто если тип Collision использовать , то ошибку пишет , что для BoxCollider2D , что для Collision , что для Collision2D … И все же , как проверять коллизию ? Именно , чтобы , как только их координаты равны (столкновение) , то сразу действия происходят… Метод скинул с парочкой изменений , просто еще чуть по гуглил … Работает или нет не пробовал , но у col1 и col2 сразу ошибки … Сразу извиняюсь , что туплю , я уже говорил , что я новичок в Unity )


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void OnCollisionStay(Collision col1, Collision col2)
    {
        col1 = col1.gameObject.GetComponent<BoxCollider2D>;
        col2 = col2.gameObject.GetComponent<Collision2D>;
 
        if (col1.collider.tag == "Player" & col2.collider.tag == "Opponent" & hp >= 1) {
            hp -= 10;
            if (opponent.transform.position.x >= hero.transform.position.x)
                opponent_rb.AddForce(Vector2.right * 8000);
            if (opponent.transform.position.x <= hero.transform.position.x)
                opponent_rb.AddForce(Vector2.left * 8000);
        }
 
        if (col1.collider.tag == "Player" & col1.collider.tag == "Opponent" & hp <= 0) {
            Debug.Log("Противник уничтожен (Должен быть)");
            if (opponent.transform.position.x >= hero.transform.position.x)
                opponent_rb.AddForce(Vector2.right * 8000);
            if (opponent.transform.position.x <= hero.transform.position.x)
                opponent_rb.AddForce(Vector2.left * 8000);
        }
        
    }
0
2966 / 1526 / 887
Регистрация: 26.10.2018
Сообщений: 4,376
29.10.2018, 17:15 12
Я тебя вообще не понимаю, прости, то что ты делаешь это бред, объясни подробней, что ты хочешь сделать.
0
41 / 4 / 0
Регистрация: 26.10.2018
Сообщений: 79
29.10.2018, 17:59  [ТС] 13
1max1, я хочу проверить столкновение двух объектов (тег первого Player , тег второго Opponent) … Я хочу сделать , чтобы при коллизии врага и игрока откидывало и чтобы у них жизни отнимались , у кого жизни = 0 , тот погибает
0
2966 / 1526 / 887
Регистрация: 26.10.2018
Сообщений: 4,376
29.10.2018, 18:14 14
Ну я же кинул тебе скрипт, только ты казал что хп отнимаются только у врага...
Кстати почему ты используешь OnCollisionEnter, а не OnCollisionEnter2D, у тебя ведь 2д игра, или нет?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Player : MonoBehaviour
{
    public int hp = 100;
 
    Rigidbody rb;
 
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
 
    void OnCollisionEnter(Collision collision)
    {
        if (collision.collider.tag == "Opponent")
        {
            hp -= 10;
 
            if (hp <= 0)
            {
                Destroy(gameObject);
            }
            else
            {
                Transform opponent = collision.transform;
                Vector3 directionForce = transform.position.x > opponent.position.x ? Vector3.right : Vector3.left;
                rb.AddForce(directionForce * 8000);
            }
        }
    }
}
 
class Opponent : MonoBehaviour
{
    public int hp = 100;
 
    Rigidbody rb;
 
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
 
    void OnCollisionEnter(Collision collision)
    {
        if (collision.collider.tag == "Player")
        {
            hp -= 10;
 
            if (hp <= 0)
            {
                Destroy(gameObject);
            }
            else
            {
                Transform player = collision.transform;
                Vector3 directionForce = transform.position.x > player.position.x ? Vector3.right : Vector3.left;
                rb.AddForce(directionForce * 8000);
            }
        }
    }
}
0
41 / 4 / 0
Регистрация: 26.10.2018
Сообщений: 79
30.10.2018, 19:24  [ТС] 15
1max1, не работает … 1) Про OnCollisionEnter2D пишет , что ошибка 2) Забил все , как ты предложил , но вместо RigidBody , RigidBody2D , т.к. игра 2D … Противник идет в строну игрока , сдавливает его к границе карты и больше ничего не происходит
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2018, 19:24

Убийство противника,врага Unity C# Collider and Raycast
Добрый день друзья подскажите пожалуйста как решить проблемку. Есть персонаж и два врага. Персонаж...

Движение зигзагом Unity C#
Ребят. Как заставить объект двигаться зигзагом? Не просто перемещать его по заранее заданным...

Движение пальцем в лабиринте Unity
Пишу игру на андроид, суть в прохождении лабиринта через движение пальцем по экрану, но проблема в...

Движение игрока - Rigidbody Unity 5.6.0
Здравствуйте! Есть простой скрипт с 2 вариантами движения игрока: using System.Collections;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru