Как работает OnCollisionEnter?

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

Как работает OnCollisionEnter?

Сообщение Prophet_Sunboy 10 май 2019, 00:08

Проблема в том, что скрипт работает на одном теле, но мне нужно чтобы он работал не на нём, а на дочернем этого тела объекте. Вешая скрипт на дочерний объект, при касании его с врагом, ничего не происходит.

Что делать?

скрипт:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using UnityEngine;
using UnityEngine.UI;

public class HP : MonoBehaviour {

    public int hp;
    public Text mt;

    // Use this for initialization
    void Start () {
        hp = 3;
        mt.text = "HP: " + hp.ToString();
    }
       
        // Update is called once per frame
        void Update () {
        if (hp <= 0) SceneManager.LoadScene("Death");
        }

    private void OnCollisionEnter(Collision col)
    {
        if (col.gameObject.tag == "Enemy")
        {
            hp = hp - 1;
            mt.text = "HP: " + hp.ToString();
        }
    }
}
Prophet_Sunboy
UNец
 
Сообщения: 11
Зарегистрирован: 30 мар 2019, 23:19

Re: Как работает OnCollisionEnter?

Сообщение 1max1 10 май 2019, 00:13

Rigidbody и коллайдер есть на твоем дочернем?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как работает OnCollisionEnter?

Сообщение ~AvA~ 10 май 2019, 09:02

Скрипт тоже должен висеть на дочернем (вроде бы), чтобы сработал
Аватара пользователя
~AvA~
UNIверсал
 
Сообщения: 396
Зарегистрирован: 17 фев 2015, 13:09

Re: Как работает OnCollisionEnter?

Сообщение Prophet_Sunboy 10 май 2019, 22:35

1max1 писал(а):Rigidbody и коллайдер есть на твоем дочернем?

Коллайдер есть, а RigidBody обязательно? Просто он уже висит на родителе.

P.S. дело в том, что родительскому объекту принадлежат несколько дочерних, и если скрипт повесить на родителя то скрипт будет срабатывать от прикосновения к любому дочернему, а мне надо чтобы срабатывал только от прикосновения к одному определённому.
Prophet_Sunboy
UNец
 
Сообщения: 11
Зарегистрирован: 30 мар 2019, 23:19

Re: Как работает OnCollisionEnter?

Сообщение 1max1 10 май 2019, 22:48

Через костыль наверное можно:
Синтаксис:
Используется csharp
void OnCollisionEnter(Collision collision)
{
    if (collision.GetContact(0).thisCollider.gameObject.name == "Object1")
    {

    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как работает OnCollisionEnter?

Сообщение AlexandrBuryakov 11 май 2019, 01:59

А ещё есть слои которые ты можешь настроить на конкретные взаимодействия. https://docs.unity3d.com/ScriptReference/Physics.IgnoreLayerCollision.html
Например:
Синтаксис:
Используется csharp
//Игнорим коллизию слоёв 0 и 10 между собой. 0 - это слой по умолчанию "default", в нём объекты обычно находятся, а с вроде 8 или 9 по 30 уже можешь любой использовать сам.
int ignoreLayerCollisionSphereCollider = 10;
Physics.IgnoreLayerCollision ( 0, ignoreLayerCollisionSphereCollider );

//А на объектах где надо ставим слой 10
go.layer = ignoreLayerCollisionSphereCollider;

//Сам недавно нашёл и пользуюсь)))
 


А ещё вот такая штука для дочерних объектов тоже используется.
Там поясняется "Это полезно, скажем, для предотвращения столкновения снарядов с предметом, который их выстреливает."
https://docs.unity3d.com/ScriptReference/Physics.IgnoreCollision.html

[V] (popcorn1)
AlexandrBuryakov
UNIт
 
Сообщения: 59
Зарегистрирован: 26 янв 2019, 14:36

Re: Как работает OnCollisionEnter?

Сообщение Prophet_Sunboy 12 май 2019, 13:36

AlexandrBuryakov писал(а):А ещё есть слои которые ты можешь настроить на конкретные взаимодействия
//Игнорим коллизию слоёв 0 и 10 между собой. 0 - это слой по умолчанию "default", в нём объекты обычно находятся, а с вроде 8 или 9 по 30 уже можешь любой использовать сам.
int ignoreLayerCollisionSphereCollider = 10;
Physics.IgnoreLayerCollision ( 0, ignoreLayerCollisionSphereCollider );

Интересная вещь.
Но это тоже не помогает.
В чём суть моей проблемы: есть объект игрока, состоящий из пустого объекта, в нём куб(типо тело игрока) и в кубе конус(меч), также есть другой объект - врага, который должен уничтожаться при косании с мечом.
Но как бы я не помечал меч(тег, слой или имя) в скрипте врага, он(враг) думал что его касается первоначальный, пустой объект.
Как это исправить?

P.S.
И так же на этом пустом объекте висит скрипт для здоровья, и когда меч касается врага то отнимаются жизни, а не уничтожается враг
Prophet_Sunboy
UNец
 
Сообщения: 11
Зарегистрирован: 30 мар 2019, 23:19


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9