Четверг, 14 Ноября 2024, 21:48

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
RagdollTest
levsha161Дата: Воскресенье, 07 Июня 2015, 01:29 | Сообщение # 1
был не раз
Сейчас нет на сайте
Всем привет,нашел на просторах интернета проект под название RagdollTest.
При нажатии на персонажа или любые его части тела включается Ragdoll(ясен ... все с помощь raycast), как сделать чтобы рэгдол включался не по нажатию на объект а при столкновению с чем то,скажем бокс с определенным тэгом.Очень надеюсь на вас.
Собственно скрипт отвечающий за это.
Код
using UnityEngine;
using System.Collections;

public class StairDismount : MonoBehaviour {
   //Declare a member variables for distributing the impacts over several frames
   float impactEndTime=0;
   Rigidbody impactTarget=null;
   Vector3 impact;
   //Current score
   public int score;
   //A prefab for displaying points (floats up, fades out, instantiated by the RagdollPartScript)
   public GameObject scoreTextTemplate;
   // Use this for initialization
   void Start () {
     
    //Get all the rigid bodies that belong to the ragdoll
    Rigidbody[] rigidBodies=GetComponentsInChildren<Rigidbody>();
      
    //Add the RagdollPartScript to all the gameobjects that also have the a rigid body
    foreach (Rigidbody body in rigidBodies)
    {
     RagdollPartScript rps=body.gameObject.AddComponent<RagdollPartScript>();
       
     //Set the scripts mainScript reference so that it can access
     //the score and scoreTextTemplate member variables above
     rps.mainScript=this;
    }
   }
     
   // Update is called once per frame
   void Update () {
    //if left mouse button clicked
    if (Input.GetMouseButtonDown(0))
    {
     //Get a ray going from the camera through the mouse cursor
     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
       
     //check if the ray hits a physic collider
     RaycastHit hit; //a local variable that will receive the hit info from the Raycast call below
     if (Physics.Raycast(ray,out hit))
     {
      //check if the raycast target has a rigid body (belongs to the ragdoll)
      if (hit.rigidbody!=null)
      {
       //find the RagdollHelper component and activate ragdolling
       RagdollHelper helper=GetComponent<RagdollHelper>();
       helper.ragdolled=true;
         
       //set the impact target to whatever the ray hit
       impactTarget = hit.rigidbody;
         
       //impact direction also according to the ray
       impact = ray.direction * 2.0f;
         
       //the impact will be reapplied for the next 250ms
       //to make the connected objects follow even though the simulated body joints
       //might stretch
       impactEndTime=Time.time+0.25f;
      }
     }
    }
      
    //Pressing space makes the character get up, assuming that the character root has
    //a RagdollHelper script
    if (Input.GetKeyDown(KeyCode.Space))
    {
     RagdollHelper helper=GetComponent<RagdollHelper>();
     helper.ragdolled=false;
    }   
      
    //Check if we need to apply an impact
    if (Time.time<impactEndTime)
    {
     impactTarget.AddForce(impact,ForceMode.VelocityChange);
    }
   }
}
berilДата: Воскресенье, 07 Июня 2015, 01:59 | Сообщение # 2
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Вынести все, что в if (Input.GetMouseButtonDown(0))
в метод столкновения (OnCollisionEnter или что там именно хочешь)




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
levsha161Дата: Воскресенье, 07 Июня 2015, 02:19 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата beril ()
Вынести все, что в if (Input.GetMouseButtonDown(0))
в метод столкновения (OnCollisionEnter или что там именно хочешь)

Да верно, но потом я так понимаю нужно как то hit заменить на contact point, и что такое ray.direction я не знаю,и на что его заменить
berilДата: Воскресенье, 07 Июня 2015, 02:23 | Сообщение # 4
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Если не ошибаюсь, нету под рукой unity
void OnCollisionEnter(Collision collision) {
collision.rigibody......
collision.contacts
}




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
levsha161Дата: Воскресенье, 07 Июня 2015, 21:54 | Сообщение # 5
был не раз
Сейчас нет на сайте
К сожалению не могу это каким то образом связать

Добавлено (07 июня 2015, 21:54)
---------------------------------------------
А как получить направление объекта который столкнулся с игроком?

EgoorДата: Воскресенье, 07 Июня 2015, 22:46 | Сообщение # 6
участник
Сейчас нет на сайте
Цитата levsha161 ()
А как получить направление объекта который столкнулся с игроком?

rigidbody.velocity
MANMANAДата: Воскресенье, 07 Июня 2015, 23:11 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
скрипт, который повесишь на объект, который будет сталкиваться с твоим Warrior
Код
using UnityEngine;
using System.Collections;

public class rew : MonoBehaviour {
public GameObject warriorObj;
StairDismount ragScript;
// Use this for initialization
void Start () {
warriorObj = GameObject.Find("Warrior");
ragScript = warriorObj.GetComponent<StairDismount>();
}
void OnCollisionEnter (Collision col)
{
if (col.gameObject.name == "Hips")
{
ragScript.impactTarget = col.rigidbody;
ragScript.colli = true;
ragScript.impact = GetComponent<Rigidbody>().velocity;
}

}
// Update is called once per frame
void Update () {

}
}


в свой скрипт StairDismount добавляешь
public bool colli = false;
а также переменные
Rigidbody impactTarget=null;
Vector3 impact;
делаешь публичными, т.е. вот так

public Rigidbody impactTarget=null;
public Vector3 impact;

в Update добавляешь
Код
  if (colli)
     {
      RagdollHelper helper=GetComponent<RagdollHelper>();
      helper.ragdolled=true;
      impactEndTime=Time.time+0.25f;
     }


собрал на коленке


http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг
VKонтакте 3Dbuffer

Последнее:

Новый раздел "Текстуры"

Как запатентовать, защитить техническое решение, игру, идею


Сообщение отредактировал MANMANA - Воскресенье, 07 Июня 2015, 23:12
levsha161Дата: Понедельник, 08 Июня 2015, 16:10 | Сообщение # 8
был не раз
Сейчас нет на сайте
Как проверить столкновение дочернего объекта,если скрипт висит на родительском?
NEBRДата: Понедельник, 08 Июня 2015, 17:16 | Сообщение # 9
почти ветеран
Сейчас нет на сайте
Прямого решения нет, насколько я знаю. Я обычно создаю для дочернего скрипта отдельный скрипт, в котором при столкновении вызываю нужный метод родительского скрипта

King Size #Gamiron12
MANMANAДата: Понедельник, 08 Июня 2015, 21:43 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
Цитата levsha161 ()
Как проверить столкновение дочернего объекта,если скрипт висит на родительском?
smile кхе, кхе. полагаю, ты не оттуда заходишь smile
ты все про тот же тестовый проэкт? Не получается проверить столкновения, поскольку коллайдеры принадлежат регдоллу? Тогда, думаю, так...
1. посмотри, ведь в скрипте есть сбор всех дочерних ригидбади "Rigidbody[] rigidBodies=GetComponentsInChildren<Rigidbody>();"
Код
void Start () {
   
   //Get all the rigid bodies that belong to the ragdoll
   Rigidbody[] rigidBodies=GetComponentsInChildren<Rigidbody>();
    
   //Add the RagdollPartScript to all the gameobjects that also have the a rigid body
   foreach (Rigidbody body in rigidBodies)
   {
    RagdollPartScript rps=body.gameObject.AddComponent<RagdollPartScript>();
     
    //Set the scripts mainScript reference so that it can access
    //the score and scoreTextTemplate member variables above
    rps.mainScript=this;
   }
  }

Вот эта строчка добавляет определенный скрипт каждому ригидбади RagdollPartScript rps=body.gameObject.AddComponent<RagdollPartScript>();

Создай скрипт для столкновений с void OnCollisionEnter (Collision col){...}только пол исключи smile
назначь его также, как и выше каждому ригидбади и будет тебе счастье
p.s. в оригинальном тестовом проекте добавляется скрипт RagdollPartScript.cs (см. выше), но для его запуска должны быть выполнены определенные условия, ты также можешь задать кучу условий в {...} после void OnCollisionEnter (Collision col)

2. Или же: Коллайдер также является компонентом
Собери все дочерние коллайдеры
Collider[] collIders=GetComponentsInChildren<Collider>();
далее можно в скрипте StairDismount посредством цикла foreach пробегать все коллайдеры из созданного массива collIders в Update и вызывать функцию/метод проверки столкновений, наверное...


http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг
VKонтакте 3Dbuffer

Последнее:

Новый раздел "Текстуры"

Как запатентовать, защитить техническое решение, игру, идею
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг