1 / 1 / 0
Регистрация: 07.10.2019
Сообщений: 111
1

Проблема стрельбы врагов через стены по игроку в TDS Unity2D (игра с видом сверху)

29.11.2019, 19:24. Показов 2662. Ответов 3
Метки нет (Все метки)

Здравствуйте уважаемые знатоки). У меня враги стреляют в меня через стены, а мне этого не надо. Я не знаю как реализовать это, так чтобы они не видели меня и не наводились через стены. Прошу помощи. Буду очень признателен.
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class II_soliders_enemy : MonoBehaviour
{
    AudioSource audioSource;
    public Transform firePoint;
    public float bulletForce = 30f;
    public GameObject bulletPrefab;
    public Rigidbody2D rb;
    public float speed;
    private Transform target;
    public float timeBtwShots;
    public float startTimeBtwShots;
    public AudioClip shootClip;
    int hp = 8; 
 
 
    // Start is called before the first frame update
    void Start()
    {
        audioSource = GetComponent<AudioSource>();
        target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
        timeBtwShots = startTimeBtwShots;
    }
 
    // Update is called once per frame
 
    void FixedUpdate()
    {
        var dir = target.position - transform.position;
        var euler = transform.eulerAngles;
        euler.z = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
        euler.z = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90.0f;
        transform.eulerAngles = euler;
    }
    void Update()
    {
        if(Vector2.Distance(transform.position, target.position) < 18)
        {
            if (timeBtwShots <= 0 )
            {
                Shoot();
                timeBtwShots = startTimeBtwShots;
                audioSource.PlayOneShot(shootClip);
            }
            else 
            {
                timeBtwShots -= Time.deltaTime;
            }
        }
 
    }
 
 
    void OnCollisionEnter2D(Collision2D enemy)
    {
        if(enemy.gameObject.tag == "bullet")
        {
            hp--;
        }
        if(hp == 0)
        {
            Destroy(gameObject);
        }
 
    }
    void Shoot()
    {
        GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
        Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
        rb.AddForce(firePoint.up * bulletForce, ForceMode2D.Impulse);
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2019, 19:24
Ответы с готовыми решениями:

Вспышка после выстрела в TDS игре на Unity2D (игра с видом сверху)
Я хочу сделать вспышку после выстрела в игре. Но не знаю как это реализовать и не знаю где брать...

Наведения врага на игрока оружием в TDS ( игра с видом сверху) в Unity2D
Я хочу сделать чтобы враг наводился на игрока за которого я управляю и начинал стрелять! Но не знаю...

Дистанция стрельбы в TDS игре на unity2D (вид сверху)
Я хочу сделать так, чтобы когда игрок приближался на определенную дистанцию к врагу, то он начинал...

NavMesh в Unity2D (игра с видом сверху
У меня проблема! Я хочу сделать чтобы враги обходили стены. Но я не знаю как это реализовать. На...

3
39 / 25 / 15
Регистрация: 27.01.2019
Сообщений: 70
30.11.2019, 10:13 2
Asort, добрый день!

Попробуй реализовать проверку на видимость с помощью raycast. То есть вы бросаете луч от игрока к врагу или наоборот и проверяете встаёт ли между ними какой либо объект и задаёте свою логику обработки этого события. На сайте API скриптов Unity есть пример реализации.
0
1 / 1 / 0
Регистрация: 07.10.2019
Сообщений: 111
30.11.2019, 16:14  [ТС] 3
Блин не получается сделать. Все сделал вроде, но они теперь не стреляют. Пожалуйста можно сам код?

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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class II_soliders_enemy : MonoBehaviour
{
    AudioSource audioSource;
    public Transform firePoint;
    public float bulletForce = 30f;
    public GameObject bulletPrefab;
    public Rigidbody2D rb;
    public float speed;
    private Transform target;
    public float timeBtwShots;
    public float startTimeBtwShots;
    public AudioClip shootClip;
    int hp = 8; 
    public float rayDistance;
 
 
    // Start is called before the first frame update
    void Start()
    {
        audioSource = GetComponent<AudioSource>();
        target = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();
        timeBtwShots = startTimeBtwShots;
    }
 
    // Update is called once per frame
 
    void FixedUpdate()
    {
        var dir = target.position - transform.position;
        var euler = transform.eulerAngles;
        euler.z = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
        euler.z = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg - 90.0f;
        transform.eulerAngles = euler;
    }
    void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(target.position);
        if(Vector2.Distance(transform.position, target.position) < 18)
        {
            if(Physics.Raycast(ray))
            {
                if (timeBtwShots <= 0 )
                {
                    Shoot();
                    timeBtwShots = startTimeBtwShots;
                    audioSource.PlayOneShot(shootClip);
                }
                else 
                {
                    timeBtwShots -= Time.deltaTime;
                }
            }
  
        }
 
    }
 
 
    void OnCollisionEnter2D(Collision2D enemy)
    {
        if(enemy.gameObject.tag == "bullet")
        {
            hp--;
        }
        if(hp == 0)
        {
            Destroy(gameObject);
        }
 
    }
    void Shoot()
    {
        GameObject bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
        Rigidbody2D rb = bullet.GetComponent<Rigidbody2D>();
        rb.AddForce(firePoint.up * bulletForce, ForceMode2D.Impulse);
    }
}
0
2291 / 1465 / 849
Регистрация: 26.10.2018
Сообщений: 4,183
30.11.2019, 16:59 4
Лучший ответ Сообщение было отмечено Asort как решение

Решение

C#
1
2
3
4
5
6
7
var dir = target.position - transform.position;
RaycastHit hit;
if (Physics.Raycast(transform.position, dir.normalized, out hit))
{
    if (hit.transform == target)
    // Стреляем
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.11.2019, 16:59

Unity2D, Стрельба с видом сверху
Всем привет, кто знает как сделать стрельбу с видом сверху, вот как на этом видео, 1:23 мин....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.