2014-04-29 3 views
3

나는 포켓몬 클론을 만들고있다. 탑 기반의 타일 기반 RPG입니다.부모님을 따르지 않는 아이들

그래서 게임 자체에 4 개의 게임 개체를 추가했습니다. 아래, 왼쪽, 오른쪽으로 전화. 나는 그들을 플레이어 주위에 두었습니다. 이 설정을 사용하여 gameObject가 작동하는지 확인합니다. 물 위에 서 있습니다. 그것이 사실이라면 플레이어는 올라갈 수 없습니다. 그것은 충돌에 대한 나의 일이다. 그러나 제 아이들은 부모님을 따르고 싶지 않습니다. 내가 한 모든 I 플레이어에 게임 오브젝트의 4 끌고 있었고,이 C#을 스크립트를 추가 : 나는 2D 툴킷을 사용하고

using UnityEngine; 
using System.Collections; 

public class PlayerController : MonoBehaviour 
{ 

    public LayerMask GroundLayer; 
    Vector2 startPoint; 
    Vector2 endPoint; 
    private float increment; 
    bool isMoving; 
    public float speed; 

    public tk2dTileMap tilemap; 
    public GameObject up; 
    public GameObject down; 
    public GameObject left; 
    public GameObject right; 


    void Start() 
    { 
     startPoint = transform.position; 
     endPoint = transform.position; 


    } 

    void Update() 
    { 


     if (increment <= 1 && isMoving == true) 
     { 
      increment += speed/100; 
     } 
     else 
     { 
      isMoving = false; 
     } 

     if (isMoving) 
     { 
      transform.position = Vector2.Lerp(startPoint, endPoint, increment); 
     } 

     if (Input.GetKey(KeyCode.UpArrow) && isMoving == false) 
     { 
      if (MovementEvents(up) == 0) 
      { 
       move(up); 
      } 
     } 
     else if (Input.GetKey(KeyCode.DownArrow) && isMoving == false) 
     { 
      if (MovementEvents(down) == 0) 
      { 
       move(down); 
      } 
     } 
     else if (Input.GetKey(KeyCode.LeftArrow) && isMoving == false) 
     {  
      if (MovementEvents(left) == 0) 
      { 
       move(left); 
      } 
     } 
     else if (Input.GetKey(KeyCode.RightArrow) && isMoving == false) 
     { 
      if (MovementEvents(right) == 0) 
      { 
       move(right); 
      } 
     } 
    } 

    int MovementEvents(GameObject direction) 
    { 
     switch (tilemap.GetTileIdAtPosition(direction.transform.position, 0)) //gettileIdAtPosition returns the id of a tile in this case 0 is grass and 1 is water 
     { 
     case 0: 
      return 0; 
     default: 
      return 1; 
     } 
    } 
    void move(GameObject direction) 
    { 
     increment = 0; 
     isMoving = true; 
     startPoint = transform.position; 
     endPoint = direction.transform.position; 
    } 
} 

.

나는 그것이 잘못된 방식으로 설정하고 있기 때문에 아마도 probally 알고 있지만 내가 뭘 잘못하고있어?

답변

2

편집기에서 만든 개체와 관련이없는 스크립트 (up, down 등)에 새 GameObject을 새로 만듭니다. 이 개 솔루션은 여기에 있습니다 :

1) 당신은 편집기에서 만든 s를 GameObjectup, down 등을 할당해야합니다. 당신은 포함하도록 Start 방법을 편집하여이 작업을 수행 할 수 있습니다

up = GameObject.Find("up"); 
down = GameObject.Find("down"); 
// etc. 

에디터에서 upGameObject 이름이 무엇 이건 "up" 교체.


2) 등 다음이 경로의 up, down을 갈 경우 객체 당신이 만든 것을

up.transform.parent = parentGameObject.transform; 
down.transform.parent = parentGameObject.transform; 
// etc. 

주를 사용하여 부모 GameObject 어린이 등 등 up, down을 할당 편집기는 사용되지 않습니다. 또한 부모 개체를 설정 한 후에 새 개체를 번역해야합니다. 그렇지 않으면 부모 개체와 비교하여 (0,0,0)에 앉을 것입니다.

내가 문제를 정확하게 이해하고 있다면, 그때 당신이 당신이 등 up, down을 추가하는 방법에 실수를하는 것 같다 코멘트에 응답

편집 에디터 어린이 등의 개체 . 단순히 동일한 수준에서 부모에 그들 모두를 끌어 다음 TestParent 개체 이동, 다른 객체 부모를 기준으로 동일한 상대 위치에있어, 따라서뿐만 아니라 이동

enter image description here

그런 때마다. (여전히 부모를 기준으로하면서)

enter image description here

는 개별적으로 개체를 이동할 수 있습니다 그런 다음과 같이 스크립트에 GameObjects를 추가합니다. 다음 예제 스크립트를 사용하면 상위 개체가 1 초에 한 단위 (Y +) 위로 이동합니다. Down 개체도 초당 추가 1 단위로 이동합니다.결과적으로 ParentTest, Up, Left, Right은 초당 한 단위 씩 이동하는 반면, Down은 초당 두 단위 씩 이동하고 천천히 이동합니다.

using UnityEngine; 
using System.Collections; 

public class DeleteMe : MonoBehaviour 
{ 
    public GameObject Up; 
    public GameObject Down; 
    public GameObject Left; 
    public GameObject Right; 

    void Start() 
    { 

    } 

    // Update is called once per frame 
    void Update() 
    { 
     Move(gameObject); 
     Move(Down); 
    } 

    private void Move(GameObject obj) 
    { 
     Vector3 position = obj.transform.position; 
     position.y += UnityEngine.Time.deltaTime; 
     obj.transform.position = position; 
    } 
} 

시작에 그들의 스크린 샷 :

약간의 시간이 경과 한 또 다른 후 enter image description here

:

enter image description here

마지막으로 당신이 public를 가질 필요는 없습니다 스크립트에서 GameObject을 누른 다음 스크립트에 끌어다 놓아 어린이에게 액세스하십시오. . 같은 결과에 스크립트를 수정하여 달성 될 수있다 :

private GameObject Up; 
    private GameObject Down; 
    private GameObject Left; 
    private GameObject Right; 

    void Start() 
    { 
     Up = transform.Find("Up").gameObject; 
     Down = transform.Find("Down").gameObject; 
     Left = transform.Find("Left").gameObject; 
     Right = transform.Find("Right").gameObject; 
    } 

이 스크립트 자체 위에 드래그 앤 드롭 할 필요없이 지루한 본질을 방지하고, 또한 당신이 추가 할 수 있습니다 아이들에 액세스 할 수 있습니다 부모는 동적으로 드래그 앤 드롭 할 수 없습니다.

희망이 도움이되었습니다.

+0

글쎄 그들을 public으로 만들면 에디터에서 gameObject를 스크립트로 드래그 할 수 있습니다. 또한 게임 객체를 플레이어 위에 드래그하여 어린이가되어야합니까? – NullReference

+0

나는 그 방법을 정확하게 테스트 할 기회가 없지만 그렇게 할 기회가 생기면 업데이트 할 것이다. – ssell

+0

노력의 주인에게 감사드립니다. 감사합니다. 당신이해야 할 일은 공공 재산을 만드는 것뿐입니다. 그러면 스크립트를 추가 한 새로운 필드가 보입니다. 게임 객체를 계층 구조에서 빈 필드로 드래그하십시오. 양육에 관한 한 게임 객체를 다른 노드로 끌면됩니다. – NullReference

관련 문제