2016-03-14 5 views
2

У меня есть кольцо как игровой объект, который я перемещаю по оси y вверх и вниз с помощью клавиш клавиатуры.Как остановить движущийся объект игры, как только он столкнется с другим игровым объектом?

Как информация: Оба игровых объекта имеют прикрепленный жесткий диск, а также коллайдер.

Вот некоторый код:

// get key up and the ring will move upwards 
    if (Input.GetKey (KeyCode.UpArrow)&&(shouldMove)) 
    { 
     transform.position += Vector3.up * speed * Time.deltaTime; 
    } 

    // get key down and the ring will move downwards 
    if (Input.GetKey (KeyCode.DownArrow)) 
    { 
     transform.position += Vector3.down * speed * Time.deltaTime; 
    } 

Теперь я хотел бы делать отключить движение этого кольца, как только она попадает другой объект игры. Я попробовал функцию OnCollisionEnter, которая дает мне информацию, которую я ударил объект (используя debug.log), однако, я могу продолжать двигаться его и толкая объект игры, который был спрятан ...

void OnCollisionEnter(Collision collision) { 


    if (collision.gameObject.name == "Sphere") {    
     Debug.Log ("Hit Sphere"); 

    } 

} 
+1

Вы можете установить 'speed' до 0 и установить' 'isKinematic'to false'. –

+0

Я уже пробовал. Но тогда, как только мой игровой объект попадает в другой, он останавливается, и я не могу больше его перемещать в другом направлении. Как я могу это приспособить? – sportente

+2

Если вы используете 'rigidbody', вы должны использовать' Rigidbody.AddForce' или 'Rigidbody.velocity' вместо изменения' transform.position'. Лучше использовать физические компоненты, когда вы используете коллайдеры и жесткие тела. После того, как я напишу, я должен работать, но не было бы необходимости вводить 'isKinematic' в' false'. –

ответ

1

Примечание: Вы не используйте функциональность жесткого корпуса. Если вы хотите: Rigidbody.MovePosition(Vector3 position) вы можете использовать.

Прежде всего, проверьте невосприимчивые жёсткие жесты GameObject IsKinematic Поле true. Или удалите его. После этого вы можете изменить shouldMove = false, чтобы он не включался в инструкции if.

bool shouldMove = true; 
// get key up and the ring will move upwards 
if (Input.GetKey (KeyCode.UpArrow)&&shouldMove) ///Check shouldMove 
{ 
    transform.position += Vector3.up * speed * Time.deltaTime; 
} 

// get key down and the ring will move downwards 
if (Input.GetKey (KeyCode.DownArrow)&&shouldMove) ///Check shouldMove 
{ 
    transform.position += Vector3.down * speed * Time.deltaTime; 
} 

void OnCollisionEnter(Collision collision) { 
    if (collision.gameObject.name == "Sphere") {    
     Debug.Log ("Hit Sphere"); 
     shouldMove = false; ///Change shouldMove 
    } 
} 

Если вы хотите, чтобы: Невидимый объект не должен двигаться. Вы можете проверить поле Коллайдеры isTrigger на true. Так что вам нужно изменить OnCollisionEnter к OnTriggerEnter(Collider other) как:

void OnTriggerEnter(Collider other) { 
    if (other.gameObject.name == "Sphere") {    
      Debug.Log ("Hit Sphere"); 
      shouldMove = false; ///Change shouldMove 
    } 
} 

Если кольцо нужно нажать несколько объектов (не нужно нажать невидимые объекты, но подтолкнуть другие). Вы можете создать новый скрипт и добавить этот скрипт к невидимому объекту. (Так что проверить Невидимые объекты Коллайдер IsTrigger Поле true.) Than In editor перетащить & отбросьте свое кольцо на новые скрипты RingController место для добавления ссылки.

PS: Приведенный ниже код YourRingControllScript необходимо изменить имя сценария Ring Controller.

public YourRingControllScript ringController; 
void OnTriggerEnter(Collider other) { 
    if (other.gameObject.name == "Sphere") {    
      Debug.Log ("Hit Sphere"); 
      ringController.shouldMove = false; ///Change shouldMove 
    } 
} 

Если ваш невидимый объект конкретизирует во время выполнения, так что вы должны знать, держатели RingControllers GameObject. Вы можете найти GameObject с GameObject.Find("GameObjectName").

Вы можете добавить метод Start() это:

void Start(){ 
    ringController = GameObject.Find("RingControllerGameObject"). 
        GetComponent<YourRingControllScript>() as YourRingControllScript; //I think you don't need to add as YourRingControllScript if there is a problem without it you can add. 
}