C#

Код на юнити хелп плиз

:Используя функции физического взрыва, вытолкайте кегли массой 300 из красной области. Задача будет решена, когда все кегли покинут красную область.


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScriptTask : MonoBehaviour
{
// выполнить взрыв в момент столкновения шара с кеглей
public void OnBallKegelCollisionEnter(Collision collision, Transform InBallTransform, Rigidbody InBallRB)
{
Debug.Log("Шарик столкнулся с одной из кегель");
float radius = 10.0f;
float force = 1500.0f;
Collider[] overlappedColliders = Physics.OverlapSphere(InBallTransform.position, radius);
for (int j = 0; j < overlappedColliders.Length; j++)
{
Rigidbody rigidbody = overlappedColliders[j].attachedRigidbody;
if (rigidbody)
{
rigidbody.AddExplosionForce(force, transform.position, radius);
}
}
MZ
Muborak Zok
155
Данный код не решает задачу, которую вы описали. Он содержит метод OnBallKegelCollisionEnter, который вызывается в момент столкновения шара с кеглей. Внутри этого метода происходит взрыв в радиусе 10 единиц от позиции шара с силой 1500, который воздействует на все тела, находящиеся в этом радиусе.

Чтобы решить задачу выталкивания кеглей массой 300 из красной области, вам нужно создать скрипт на объекте, представляющем красную область, который будет проверять, находятся ли в ней кегли массой 300, и если да, то применять к ним силу, чтобы вытолкнуть их из области. Вот пример кода, который может помочь вам осуществить такую логику:

 using System.Collections; 
using System.Collections.Generic;
using UnityEngine;

public class RedAreaScript : MonoBehaviour
{
public float force = 1000f; // сила, с которой будут выталкиваться кегли

void OnTriggerStay(Collider other)
{
if (other.gameObject.tag == "Kegel" && other.gameObject.GetComponent().mass == 300)
{
// если в области находится кегля массой 300, то применяем к ней силу
other.gameObject.GetComponent().AddForce(transform.up * force, ForceMode.Impulse);
}
}
}
В этом примере OnTriggerStay вызывается каждый кадр, когда другой объект находится в триггере, который находится на объекте, на котором висит данный скрипт. Если объект в триггере имеет тэг "Kegel" и массу 300, то на него будет применена сила, направленная вверх, с силой force.
Александр Лозовицкий
Александр Лозовицкий
555
Лучший ответ
Muborak Zok спасибо конечно за ответ, но именно в том скрипте который в условии нужно решить задачу
Роман Соколов using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScriptTask : MonoBehaviour
{
// выполнить взрыв в момент столкновения шара с кеглей
public void OnBallKegelCollisionEnter(Collision collision, Transform InBallTransform, Rigidbody InBallRB)
{
Debug.Log("Шарик столкнулся с одной из кегель");
float radius = 100.0f;
float force = 15000.0f;
Collider[] overlappedColliders = Physics.OverlapSphere(InBallTransform.position, radius);
for (int j = 0; j < overlappedColliders.Length; j++)
{
Rigidbody rigidbody = overlappedColliders[j].attachedRigidbody;
if (rigidbody)
{
rigidbody.AddExplosionForce(force, transform.position, radius);
}
}
Это же C#, не?
Вот пример кода на Unity, который решает данную задачу:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class KegelGameController : MonoBehaviour
{
public Transform redArea; // ссылка на объект, представляющий красную область
public GameObject kegelPrefab; // префаб кеглей
public int kegelCount = 300; // количество кеглей, которые нужно вытолкнуть
public float explosionRadius = 10.0f; // радиус взрыва
public float explosionForce = 1500.0f; // сила взрыва

private List<GameObject> kegels; // список объектов-кеглей
private bool taskCompleted = false; // флаг, указывающий, выполнена ли задача

// метод, вызываемый при старте игры
private void Start()
{
// создаем кегли в красной области
kegels = new List<GameObject>();
for (int i = 0; i < kegelCount; i++)
{
Vector3 position = redArea.position + new Vector3(Random.Range(-3.0f, 3.0f), 0.5f, Random.Range(-3.0f, 3.0f));
GameObject kegel = Instantiate(kegelPrefab, position, Quaternion.identity);
kegels.Add(kegel);
}
}

// метод, вызываемый при столкновении шара с другим объектом
private void OnCollisionEnter(Collision collision)
{
// если столкновение произошло с кеглей, то взрываем их
if (collision.gameObject.tag == "Kegel")
{
Debug.Log("Шарик столкнулся с одной из кегель");
Collider[] overlappedColliders = Physics.OverlapSphere(collision.contacts[0].point, explosionRadius);
for (int j = 0; j < overlappedColliders.Length; j++)
{
Rigidbody rigidbody = overlappedColliders[j].attachedRigidbody;
if (rigidbody && kegels.Contains(rigidbody.gameObject))
{
rigidbody.AddExplosionForce(explosionForce, collision.contacts[0].point, explosionRadius);
}
}

// проверяем, остались ли кегли в красной области
int kegelsInRedArea = 0;
foreach (GameObject kegel in kegels)
{
if (redArea.GetComponent<Collider>().bounds.Contains(kegel.transform.position))
{
kegelsInRedArea++;
}
}

// если все кегли покинули красную область, то задача выполнена
if (kegelsInRedArea == 0)
{
Debug.Log("Задача выполнена!");
taskCompleted = true;
}
}
}

// метод, вызываемый каждый кадр
private void Update()
{
// если задача выполнена, то останавливаем игру
if (taskCompleted)
{
Time.timeScale = 0;
}
}
}

Данный скрипт создает заданное количество кеглей в