Проблемы с организацией "инверсии гравитации"

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

Проблемы с организацией "инверсии гравитации"

Сообщение Chaz 27 май 2012, 01:13

Здаров. Собственно идея такова, создать триггер который будет заставлять предметы, находящиеся в нем, медленно взлетать, а потом быстро падать на землю. Для этого я создал 2 скрипта, первый вешается на ХарактерКонтроллер, этот скрипт работает с двумя префабами, первый является цилиндрическим триггером, а второй, маленьким кубиком которого буду поднимать.
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Trigger : MonoBehaviour {
        public GameObject prefab;
        public GameObject cuby;
       

        // Use this for initialization
        void Start () {
                               
       
        }
       
        // Update is called once per frame
        void Update () {
        if(Input.GetKeyDown(KeyCode.F))
                {
                        Gravity();// создаю триггер
                }
        if(Input.GetKeyDown(KeyCode.Z))
                {
                        CreateCubys(); // создаю несколько кубиков возле плеера
                }      
        }
        public void Gravity()
        {
                GameObject pref = Instantiate(prefab,new Vector3(this.transform.position.x, 10f, this.transform.position.z), Quaternion.identity) as GameObject;
        }
        public void CreateCubys()
        {
               
                float i = 1f;
                        GameObject pref1 = Instantiate(cuby,new Vector3(this.transform.position.x+0.5f+i, this.transform.position.y, this.transform.position.z), Quaternion.identity) as GameObject;
                        GameObject pref2 = Instantiate(cuby,new Vector3(this.transform.position.x-0.5f+i, this.transform.position.y, this.transform.position.z), Quaternion.identity) as GameObject;
                        GameObject pref3 = Instantiate(cuby,new Vector3(this.transform.position.x, this.transform.position.y, this.transform.position.z+0.5f+i), Quaternion.identity) as GameObject;
                        GameObject pref4 = Instantiate(cuby,new Vector3(this.transform.position.x, this.transform.position.y, this.transform.position.z-0.5f+i), Quaternion.identity) as GameObject;
                        GameObject pref5 = Instantiate(cuby,new Vector3(this.transform.position.x+0.5f+i, this.transform.position.y, this.transform.position.z+0.5f+i), Quaternion.identity) as GameObject;
                        GameObject pref6 = Instantiate(cuby,new Vector3(this.transform.position.x-0.5f+i, this.transform.position.y, this.transform.position.z-0.5f+i), Quaternion.identity) as GameObject;
                        GameObject pref7 = Instantiate(cuby,new Vector3(this.transform.position.x+0.5f+i, this.transform.position.y, this.transform.position.z-0.5f+i), Quaternion.identity) as GameObject;
                        GameObject pref8 = Instantiate(cuby,new Vector3(this.transform.position.x-0.5f+i, this.transform.position.y, this.transform.position.z+0.5f+i), Quaternion.identity) as GameObject;
               
        }
}
 

Второй скрипт висит на префабе содержащем триггер и принимает префаб содержащий кубик (как коллайдер)
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Gravity : MonoBehaviour {
        public Collider my;
        private bool up;
        private bool down;

        // Use this for initialization
        void Start () {
                up=true;
                down=true;
       
        }
       
        // Update is called once per frame
        void Update () {
       
                if(up && down)
        OnTriggerStay(my);
               
        }
       
       
       
        void OnTriggerStay(Collider other) {
               
        if (other.attachedRigidbody)
                {
                        if(up){
             other.attachedRigidbody.constantForce.force = new Vector3(0f,10f,0f); // 1 раз применяем силу к объекту
                                up=false;                                                          //
                        }
                        if(other.transform.position.y>5f && down){ // если предмет поднялся выше чем 5 метров
                          other.attachedRigidbody.constantForce.force = new Vector3(0f,-20f,0f); // бросаем на землю с удвоенной силой + сила гравитации
                               
                                if(other.attachedRigidbody.velocity.y==0) // если скорость предмета по оси У равна нулю
                                {
                                        down=false;                           // отключаем функционал данного триггера
                                }
                               
                        }
                       
                }

}
       
}
 


Проблемы в следующем: 1 триггер работает только для 1 кубика. Если убрать проверку переменных up и down, то 1 триггер поднимает все кубики, но он работает постоянно, и после первого шмяка об землю - поднимает кубики снова и снова пока они не улетят из зоны его действия, а еще, при шмякании об землю, некоторые кубики проваливаются под терру =\ И еще, во втором скрипте я явно указываю какой объект (префаб) будет обрабатывать скрипт на триггере, можно сделать чтобы он автоматически находил все объекты в зоне его действия, и срабатывал 1 раз для каждого объекта??
Chaz
Адепт
 
Сообщения: 1412
Зарегистрирован: 07 апр 2012, 11:24

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

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

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