2016-07-25 5 views
1

В настоящее время я делаю футбольную игру.обнаружение отвода в игровом объекте в единстве

В этой мини-игре, когда игрок прикасается к мячу, он добавляет силу, и цель состоит в том, чтобы сделать более высокий балл.

Так я писал:

void Update() 
{ 
    if(Input.touchCount == 1 && Input.GetTouch(0).phase== TouchPhase.Began) 
     { 
     AddForce, and playsound ect... 
     } 

} 

с этим, когда я нажмите в любом месте экрана, он добавляет силу, но я просто хочу, чтобы добавить силу, когда я коснуться моего GameObject (шар).

Как я могу это сделать?

Спасибо! :)

+0

является футбольный мяч 2D Sprite/изображения или 3D сетки? – Programmer

+0

это 3D-сетка, и игра выглядит как мини-игра для футбола в facebook messenger. –

ответ

1

Используйте OnMouseDown() в своем скрипте. Ниже приведен пример:

using UnityEngine; 
using System.Collections; 

public class ExampleClass : MonoBehaviour { 
    void OnMouseDown() { 
     Application.LoadLevel("SomeLevel"); 
    } 
} 

P.S: удалить, что предыдущий код из Update() метода.


EDIT: Альтернативный код для мобильных устройств

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

public class OnTouchDown : MonoBehaviour 
{ 
    void Update() { 
     // Code for OnMouseDown in the iPhone. Unquote to test. 
     RaycastHit hit = new RaycastHit(); 
     for (int i = 0; i < Input.touchCount; ++i) { 
      if (Input.GetTouch(i).phase.Equals(TouchPhase.Began)) { 
      // Construct a ray from the current touch coordinates 
      Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position); 
      if (Physics.Raycast(ray, out hit)) { 
       hit.transform.gameObject.SendMessage("OnMouseDown"); 
       } 
      } 
     } 
    } 
} 

Закрепить выше сценарий для любого активного gameObject в сцене и OnMouseDown() будет работать на мобильных устройствах, а также.

+0

Я не думаю, что mouseDown будет работать, потому что я работаю на сенсорном устройстве. –

+1

@ Ophélia добавьте этот скрипт в свою сцену, и теперь вы можете работать с 'OnMouseDown()' как обычно. сделайте свой 'OnMouseDown()' метод 'public'. –

+0

Я использую void OnMouseDown(), и он работает на устройствах Android. Большое спасибо парням :) (и особому Umair M.);) –

2

При этом, когда я нажмите в любом месте экрана, он добавляет силу, но я просто хочу, чтобы добавить силу, когда я коснуться моего GameObject (шар).

Чтобы обнаружить ответвление на конкретном GameObject, вы должны использовать Raycast, чтобы обнаружить щелчок на этом футбольном мяче. Просто убедитесь, что к нему прикреплен коллайдер (например, Sphere Collider).

void Update() 
{ 
    if ((Input.touchCount > 0) && (Input.GetTouch(0).phase == TouchPhase.Began)) 
    { 
     Ray raycast = Camera.main.ScreenPointToRay(Input.GetTouch(0).position); 
     RaycastHit raycastHit; 
     if (Physics.Raycast(raycast, out raycastHit)) 
     { 
      Debug.Log("Something Hit"); 
      if (raycastHit.collider.name == "Soccer") 
      { 
       Debug.Log("Soccer Ball clicked"); 
      } 

      //OR with Tag 

      if (raycastHit.collider.CompareTag("SoccerTag")) 
      { 
       Debug.Log("Soccer Ball clicked"); 
      } 
     } 
    } 
} 
+0

он работает с android? потому что я работаю с сенсорным экраном. –

+1

Да. Пожалуйста, попробуйте код, прежде чем комментировать дальше. – Programmer

+0

Я просто использую метод void OnMouseDown, и он работает на моем устройстве Android (не единственном пульте дистанционного управления). –

0

Вам нужно сделать несколько вещей здесь

  1. вам нужно raycast прикосновение, чтобы определить, если мяч коснулся

  2. вам нужно, чтобы увеличить мощность на продолжительности действия touch

  3. необходимо уволить мяч и сбросить питание при отпускании прикосновения


Пример кода here показывает, как обращаться с rayCast

код примера here должен помочь вам с частью 2

3 просто и красиво вам просто нужно запустить свой запуск закодировать сброс на Закончилось

положить их вместе, и вы получите что-то вроде этого

public class ExampleClass : MonoBehaviour { 

    void FixedUpdate() { 
     for (int i = 0; i < Input.touchCount; ++i) { 
      Ray camRay = Camera.main.ScreenPointToRay (Input.GetTouch(i).Position); 
      RaycastHit ballHit; 
      if(Physics.Raycast (camRay, out ballHit, camRayLength, ballMask)) 
      { 
       if (Input.GetTouch(i).phase == TouchPhase.Stationary) { 
        power += speed + Time.deltaTime;    
       } 

       else if (Input.GetTouch(i).phase == TouchPhase.Ended) { 
        LauchBall(power); 
        power = 0;   
       } 
      } 
     } 
    } 
} 

Примечание: код, например, только он не был проверен и не является полным

это использует обновление физики в качестве триггера вы можете вместо того, чтобы связать непосредственно к объектам триггеров как предложено некоторые другие ответы

+1

никогда не использовать FixedUpdate – Fattie

+0

Я признаю, что я довольно новичок в Unity, поэтому я не на достаточно высоком уровне, чтобы решить, что работает и что лучше, но собственные команды Unity используют фиксированное обновление в качестве основного процесса управления пользователем введите, например, https: // unity3d.com/learn/tutorials/projects/survival-shooter/player-character? playlist = 17144 – MikeT

+0

К сожалению (большая часть) документации Unity является полной, полной, дерьмой – Fattie

0

Take Touch Event, используя Co-Rouitne, будет хорошо для вас. Если вы не будете использовать сопрограмму coroutine, то она будет постоянно проверять событие касания в OnUpdate. Лучше взять касание события в совместном режиме. Это моя ссылка, в которой вы можете проверить, как ее использовать.


http://unitycodestuff.blogspot.in/2017/11/how-to-use-co-routine-for-taking-touch.html