我正在制作一个口袋妖怪克隆。 这是一个自上而下的平铺瓦片。
所以我在玩家身上添加了4个游戏对象。向上,向下,向左,向右调用。 我把它们放在玩家周围。我用这个设置来检查gameObject是否正常。站在水面上。如果这是真的那么玩家就不能上去。这是我的碰撞工作。但是我的孩子不想跟随我的父母。我所做的就是将4个游戏对象拖到播放器上,并添加了这个c#脚本:
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;
}
}
我正在使用2d工具包。
我知道这是可能的,因为我以错误的方式设置它们但我做错了什么?
答案 0 :(得分:2)
您在脚本(GameObject
,up
等)中创建了与您在编辑器中创建的对象无关的新down
。有两种解决方案:
1)您需要将up
,down
等分配给您在编辑器中创建的GameObject
。您可以通过修改Start
方法来执行此操作,以包含:
up = GameObject.Find( "up" );
down = GameObject.Find( "down" );
// etc.
将"up"
替换为您在编辑器中命名为up
GameObject
的任何内容。
2)使用
将up
,down
等作为子项分配给您的父GameObject
up.transform.parent = parentGameObject.transform;
down.transform.parent = parentGameObject.transform;
// etc.
请注意,如果您选择此路线,则不会使用您在编辑器中创建的up
,down
等对象。您还需要翻译新对象(在设置其父对象之后),否则它们将仅位于(0,0,0)
相对于父对象。
编辑以回应评论
如果我正确理解了问题,那么您似乎只是在编辑器中将up
,down
等对象添加为子项时出错。只需将它们全部拖到同一级别的父级上:
然后,只要TestParent
对象移动,其他对象就会保持与父对象相同的相对位置,因此也会移动。然后,如果您将GameObjects
添加到如下脚本:
您可以单独移动对象(同时仍然相对于父对象)。使用以下示例脚本,父对象每秒向上移动一个单位(Y +)。 Down
对象也以每秒一个单位向上移动。这导致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;
}
}
一开始的截图:
经过一段时间后又过了一次:
最后请注意,您不需要在脚本中使用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;
}
这可以防止必须拖放到脚本本身上的繁琐工作,并且还允许您访问可能动态添加到父级的子级,因此无法拖放。
希望这有帮助!