Unity:根据平台产生的3D模型运动

时间:2018-05-30 06:40:04

标签: c# unity3d

我是团结的新手,并开始创建一个简单的曲折游戏。平台最初在X和Z方向上产生,玩家在X和Z方向上在屏幕上点击方向。

之后,假设产生了30个平台,我将平台产生切换到-X和Z轴。如何通知我的3D模型现在在屏幕上点击,它必须改变-X和Z轴的方向。

我已经编写了代码但问题出现了,当方向切换发生时我无法告诉我的角色。所以碰巧平台仍在X和Z轴上产生,但我的角色现在在-X和Z轴上移动。

如何让平台产生和角色方向同步?

CODE

以下是平台产生的代码

 void SpawnPlatform() {

 if(score  < 30)
 {
  int rand = Random.Range(0, 6);
  if (rand < 3)
  {
     SpawnX();
  }
  else if(rand >= 3)
  {
     SpawnZ();
  }
 }
if(score > 30)
{
  int rand = Random.Range(0, 6);
  if (rand < 3)
  {
     SpawnNegX();
  }
  else if(rand >= 3)
  {
     SpawnZ();
  }
}

void SpawnX()
{
  Vector3 pos = lastPos;
  pos.x += size;
  lastPos = pos;
  Instantiate(platform, pos, Quaternion.identity);

  int rand = Random.Range(0, 4);
  if (rand < 1)
  {
      Instantiate(diamonds, new Vector3(pos.x,pos.y+1,pos.z), 
      diamonds.transform.rotation);
  }
}

 void SpawnNegX()
 {
 Vector3 pos = lastPos;
 pos.x -= size;
 lastPos = pos;
 Instantiate(platform, pos, Quaternion.identity);

 int rand = Random.Range(0, 4);
 if (rand < 1)
 {
     Instantiate(diamonds, new Vector3(pos.x,pos.y+1,pos.z), 
     diamonds.transform.rotation);
 }

 }

 void SpawnZ()
 {
 Vector3 pos = lastPos;
 pos.z += size;
 lastPos = pos;
 Instantiate(platform, pos, Quaternion.identity);

 int rand = Random.Range(0, 4);
 if (rand < 1)
 {
     Instantiate(diamonds, new Vector3(pos.x, pos.y + 1, pos.z), 
     diamonds.transform.rotation);
 }
}

这是角色控制器。问题在这里。如何通知角色现在在-X和Z之间切换方向而不是X和Z.

 void Update () {
 if (!started)
 {
     if (Input.GetMouseButtonDown(0))
     {
         rb.velocity = new Vector3(speed, 0, 0);
     }
 }

 if (!Physics.Raycast(transform.position, Vector3.down, 1f))
 {
     rb.velocity = new Vector3(0, -25f, 0);
 }

 if (Input.GetMouseButtonDown(0) && !gameOver)
 {
     SwitchDirection();
 }
}

 void SwitchDirection()
 {
 if (rb.velocity.z > 0)
 {
     rb.velocity = new Vector3(speed, 0, 0);
 }else if(rb.velocity.x > 0)
 {
     rb.velocity = new Vector3(0, 0, speed);
 }
}

我正在复制经典之字形游戏,但也在其他方向产生平台。所以它现在看起来像原来的游戏。

enter image description here

2 个答案:

答案 0 :(得分:2)

由于您要提前生成多个平台,可能在X-X+-X,因此您无法在生成第一个X+平台后生成一个bool来翻转X.

您需要知道下一个平台的位置。或者更好,如果void SwitchDirection() { if (rb.velocity.z > 0) { bool platformInXplus = Physics.CheckBox(transform.position + Vector3.right * size, Vector3.one * .1f + Vector3.up * 2f, Quaternion.identity, /*layermask*/ 0, QueryTriggerInteraction.UseGlobal); if(platformInXplus) { rb.velocity = new Vector3(speed, 0, 0); } else { rb.velocity = new Vector3(-speed, 0, 0); } } else if(Mathf.Abs(rb.velocity.x) > 0f) { rb.velocity = new Vector3(0, 0, speed); } } 中有一个平台。

我的方法使用Physics.Checkbox来检查(Raycast也会工作),平台需要一个boxcollider才能工作。

enter image description here

代码:

CheckBox

如果游戏中有更多碰撞者,您可以将平台放在图层上,并在rb.velocity.x > 0中使用正确的layermask。 (例如,为了避免检查钻石)

编辑:我更改了X+,因为在所有情况下都不再如此。我现在使用绝对来检查我们是否正在进入X-Vector3.one * .1f + Vector3.up * 2f

edit2:我将CheckBox大小更改为size

edit3:如果你站在平台的最左边,checkBox可能会命中当前平台。您可能希望首先围绕玩家位置,以捕捉平台网格(这样您就可以在当前平台上居中,然后向右检查(.1, 2.1, .1)个单位)

所以它 def remove(self,data,previousNode): if self.data == data: # we hit the node we want to delete previousNode.nextNode=self.nextNode # we disconnect the current node from the link, connect the next node to its previous node del self.data # not exactly sure about these two lines del self.nextNode else: # we haven't hit the node we want to delete if self.nextNode is not None: # the list hasn't end, there is a "next" self.nextNode.remove(data, self) # this is the tricky part, # you need to consider this in nextNode's perspective. # You're calling nextNode's remove method, # telling it the data you need to remove, and tell it # that it's previousNode is your current node (self) 确保你击中平台,即使玩家来源高于它。

答案 1 :(得分:0)

发生

问题时,我无法在方向切换时告诉我的角色。

您只需要从平台spawing-script中引用播放器脚本,并告知它方向已更改。

您已经在播放器中创建了该功能:SwitchDirection(),因此您可以在Spawing脚本中添加此功能。

在检查器中,您需要将播放器与Spawing脚本链接起来(在Inspector中将播放器GameObject拖放到Spawing脚本中的mPlayer变量字段上)

public GameObject mPlayer;
PlayerScript mPlayerScript;

Start(){
    mPlayerScript = mPlayer.GetComponent<PlayerScript>();
}

根据您的评论更新:说前30个平台是在-x方向生成的。所以角色移动-x点击。从31到60,平台在X方向产卵。所以第31个平台就是应该通知角色关于开关以后,你在这里增加分数:

if(score%30 == 0)
{
    mPlayerScript.SwitchDirection()
}