Unity — BoxCollider2D — Почему происходит коллизия объекта с самим собой?

Код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyScript : MonoBehaviour
{
    [Header("Объекты")]
    [SerializeField] public GameObject tower;
    [SerializeField] public GameObject prefabBullet;

    [Header("Параметры")]
    [SerializeField] public float moveSpeed;
    [SerializeField] public float rotateSpeed;
    [SerializeField] public float towerSpeed;
    [SerializeField] public float bulletSpeed;
    [SerializeField] public float easyReloadTime;
    [SerializeField] public float maxViewDistance;

    bool ready = true;
    RaycastHit2D raycast;
    PlayerScript player;

    private void Awake()
    {
        player = FindObjectOfType<PlayerScript>();
    }

    void Update()
    {
        //Move();
        RotateTower();
        Raycast();
    }

    void Move()
    {
        if (true)
        {
            transform.position += new Vector3(transform.up.x * moveSpeed * Time.deltaTime, transform.up.y * moveSpeed * Time.deltaTime, 0);
        }
        else if (true)
        {
            transform.position -= new Vector3(transform.up.x * moveSpeed * Time.deltaTime, transform.up.y * moveSpeed * Time.deltaTime, 0);
        }
        if (true)
        {
            transform.rotation = Quaternion.Euler(0, 0, transform.rotation.eulerAngles.z + rotateSpeed * Time.deltaTime * 180);
            tower.transform.rotation = Quaternion.Euler(0, 0, tower.transform.rotation.eulerAngles.z - rotateSpeed * Time.deltaTime);
        }
        else if (true)
        {
            transform.rotation = Quaternion.Euler(0, 0, transform.rotation.eulerAngles.z - rotateSpeed * Time.deltaTime * 180);
            tower.transform.rotation = Quaternion.Euler(0, 0, tower.transform.rotation.eulerAngles.z + rotateSpeed * Time.deltaTime);
        }
    }

    void RotateTower()
    {
        tower.transform.rotation = Quaternion.Euler(0, 0, Mathf.Atan2(player.transform.position.y - transform.position.y, player.transform.position.x - transform.position.x) * 180 / Mathf.PI - 90);
    }

    void Shoot()
    {
        if (ready)
        {
            GameObject clone = Instantiate(prefabBullet, tower.transform.position, tower.transform.rotation);
            clone.AddComponent<BulletScript>();
            clone.GetComponent<BulletScript>().speed = bulletSpeed;
            clone.GetComponent<BulletScript>().type = false;
            ready = false;
            StartCoroutine(EasyReload());
        }
    }

    IEnumerator EasyReload()
    {
        yield return new WaitForSeconds(easyReloadTime);
        ready = true;
    }

    //Проблемный Участок Кода
    void Raycast()
    {
        raycast = Physics2D.Raycast(new Vector3(transform.position.x + transform.up.x * 4, transform.position.y + transform.up.y * 4, transform.position.z), player.transform.position, maxViewDistance);
        if (raycast) 
        {
            if (raycast.collider.gameObject.tag == "Player")
            {
                Shoot();
            }
        }
    }
}


Установленные Параметры:
X6QIzshy.jpg?download=1&name=%D0%A1%D0%BA%D1%80%D0%B8%D0%BD%D1%88%D0%BE%D1%82%2019-08-2021%2021:54:41.jpg
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
CHIDWI
@CHIDWI
Unity3D Developer
Если по правильному то Raycast исходит из центра объекта, и он сразу врезается в свой же коллайдер. Соответственно точку из которой посылается луч, нужно вынести за пределы коллайдера. У вас же обратная ситуация, луч посылается откуда-то из вне со смещением, в центр нашего объекта. Из чего следует вывод, что если между точкой откуда идёт луч и до центра персонажа, нет никаких других коллайдеров, то он попадает в персонажа.
Вариант решения:
- Отрисовать луч через Debug.DrawRay или Debug.DrawLine (что-то такое и настроить правильное смещение конечной точки).
- Экспериментальным путём найти подходящие значения.
- Создать в персонаже 2 дополнительных ГО и использовать их как конечную и начальную точки луча.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы