2016-06-15 46 views
0

所以我以前的線程顯示,我創建從精靈圖像的gameObject拖動和使用此代碼在運行時移動2D遊戲對象

tex = Resources.Load<Texture2D>("pig") as Texture2D; 
Sprite sprite = new Sprite(); 
sprite = Sprite.Create(tex, new Rect(0, 0, 250, 150), new Vector2(0.5f, 0.5f)); 
GameObject newSprite = new GameObject(); 
newSprite.AddComponent<Rigidbody2D>(); 
newSprite.GetComponent<Rigidbody2D>().gravityScale = 0f; 
newSprite.AddComponent<ObjectMovement>(); 
newSprite.AddComponent<SpriteRenderer>(); 
SR = newSprite.GetComponent<SpriteRenderer>(); 
SR.sprite = sprite; 

正如你看到我添加了一個劇本「ObjectMovement」,我想檢查這個腳本是否有人拖動這個特定的gameObject,如果是的話,讓它跟隨觸摸位置,只要提及 - 這個遊戲是2D。我從來沒有使用RaysRaycast,所以我不知道我錯在哪裏。反正這是我的腳本代碼:

public SpriteRenderer selection=null; 
    void Update() 
    { 
     if (Input.touchCount >= 1) 
     { 
      foreach (Touch touch in Input.touches) 
      { 
       Ray ray = Camera.main.ScreenPointToRay(touch.position); 
       RaycastHit hit; 
       switch (touch.phase) 
       { 
        case TouchPhase.Began: 
         if (Physics.Raycast(ray, out hit, 100)) 
          selection = hit.transform.gameObject.GetComponent<SpriteRenderer>(); 
         break; 
        case TouchPhase.Moved: 
         selection.transform.position = new Vector2(selection.transform.position.x + touch.position.x/10, selection.transform.position.y + touch.position.y/10); 
         break; 
        case TouchPhase.Ended: 
         selection = null; 
         break; 
       } 
      } 
     } 
    } 

所以基本上 - 觸摸屏幕時,火ray,並檢查其gameObject是在這個位置上,移動手指做時,它遵循它。拖放。謝謝。

編輯:我注意到腳本附在每個gameObject這是不是有效的,任何想法?

+2

一定要勾選下面 – Fattie

+0

@JoeBlow確保大方回答,他幫助了我很多。我在等待他的意見。 – DAVIDBALAS1

回答

2

對於2D,您使用RaycastHit2DPhysics2D.Raycast而不是RaycastHitPhysics.Raycast。這些是3D。其次,確保將對撞機連接到Sprite。由於這是一款2D遊戲,對撞機必須在其中包含文字「2D」。例如,編輯器中的Box Colider 2D。您也可以使用Circle Collider 2D

我注意到腳本附加在每個gameObject上,而不是 有效,有什麼想法?

只需創建一個空的GameObject並將該腳本附加到它。而已。

這裏是你的代碼的固定版本:

float tempZAxis; 
public SpriteRenderer selection; 
void Update() 
{ 
    Touch[] touch = Input.touches; 
    for (int i = 0; i < touch.Length; i++) 
    { 
     Vector2 ray = Camera.main.ScreenToWorldPoint(Input.GetTouch(i).position); 
     RaycastHit2D hit = Physics2D.Raycast(ray, Vector2.zero); 
     switch (touch[i].phase) 
     { 
      case TouchPhase.Began: 
       if (hit) 
       { 
        selection = hit.transform.gameObject.GetComponent<SpriteRenderer>(); 
        if (selection != null) 
        { 
         tempZAxis = selection.transform.position.z; 
        } 
       } 
       break; 
      case TouchPhase.Moved: 
       Vector3 tempVec = Camera.main.ScreenToWorldPoint(touch[i].position); 
       tempVec.z = tempZAxis; //Make sure that the z zxis never change 
       if (selection != null) 
       { 
        selection.transform.position = tempVec; 
       } 
       break; 
      case TouchPhase.Ended: 
       selection = null; 
       break; 
     } 

    } 
} 

這隻會在移動工作,但不是在桌面上生成。我建議你執行IBeginDragHandler,IDragHandler,IEndDragHandler並覆蓋它們附帶的功能。現在,它將與移動和桌面平臺兼容。

注:對於你必須附上下面的腳本你想不同於上面的第一個腳本,將所有精靈的第二個解決方案。

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 
using UnityEngine.EventSystems; 

public class Dragger : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler 
{ 

    Camera mainCamera; 
    float zAxis = 0; 
    Vector3 clickOffset = Vector3.zero; 

    // Use this for initialization 
    void Start() 
    { 
     //Comment this Section if EventSystem system is already in the Scene 
     addEventSystem(); 


     mainCamera = Camera.main; 
     mainCamera.gameObject.AddComponent<Physics2DRaycaster>(); 

     zAxis = transform.position.z; 
    } 

    public void OnBeginDrag(PointerEventData eventData) 
    { 
     clickOffset = transform.position - mainCamera.ScreenToWorldPoint(new Vector3(eventData.position.x, eventData.position.y, zAxis)); 
    } 

    public void OnDrag(PointerEventData eventData) 
    { 
     //Use Offset To Prevent Sprite from Jumping to where the finger is 
     Vector3 tempVec = mainCamera.ScreenToWorldPoint(eventData.position) + clickOffset; 
     tempVec.z = zAxis; //Make sure that the z zxis never change 

     transform.position = tempVec; 
    } 

    public void OnEndDrag(PointerEventData eventData) 
    { 

    } 

    //Add Event Syste to the Camera 
    void addEventSystem() 
    { 
     GameObject eventSystem = new GameObject("EventSystem"); 
     eventSystem.AddComponent<EventSystem>(); 
     eventSystem.AddComponent<StandaloneInputModule>(); 
    } 
} 
+0

對於第二個腳本,我得到一個錯誤 - 場景中的多個事件系統... – DAVIDBALAS1

+0

通過評論這一部分,你的意思是圍繞着if語句嗎? – DAVIDBALAS1

+0

@ DAVIDBALAS1不,這意味着在'addEventSystem();'前面加'//'或者從'Start()'函數中刪除'addEventSystem();'。添加'//'會告訴編譯器不編譯該行代碼。所以,用'addEventSystem();'替換'addEventSystem();'或者將其刪除。 – Programmer