【问题标题】:Unity : 3d Model Movement according to platform spawningUnity:根据平台生成的 3d 模型运动
【发布时间】:2018-05-30 20:47:29
【问题描述】:

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

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

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

如何使平台生成和角色方向同步?

代码

这是平台生成的代码

 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

【问题讨论】:

  • 你是不是用这个函数来切换方向SwitchDirection()?在 Spawning 代码的哪几行之后,您想执行此切换?我给了你一个关于如何从一个脚本调用一个方法到另一个脚本的答案,但是为了让它正常工作,我需要确切地知道你在何时何地实现这个方向切换。
  • @IgnacioAlorre 说前 30 个平台是在 -x 方向生成的。所以角色在点击时移动 -x 。从 31 到 60,平台在 X 方向生成。所以第 31 个平台是应该通知角色切换的时间。

标签: c# unity3d


【解决方案1】:

由于您在前面生成多个平台,可能在 Z+X-X+ 中,您不能在生成第一个 -X 平台后创建一个布尔值来翻转 X。

您需要知道下一个平台在哪里。或者更好,如果X+ 中是否有平台。

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

代码:

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);
   }
}

如果您的游戏中有更多碰撞器,您可以将平台放在一个层上,并在CheckBox 中使用正确的layermask。 (例如,为了避免检查您的钻石)

编辑:我更改了rb.velocity.x &gt; 0,因为这不再适用于所有情况。我现在使用绝对值来检查我们是否要搬入 X+X-

edit2:我将 CheckBox 大小更改为Vector3.one * .1f + Vector3.up * 2f

edit3:如果您站在平台的左侧很远,复选框可能会命中当前平台。您可能希望先将玩家位置四舍五入,以捕捉到平台网格(因此您开始以当前平台为中心,然后检查右侧的 size 个单位)

所以它是(.1, 2.1, .1) 以确保您击中平台,即使玩家原点位于平台之上。

【讨论】:

  • 谢谢@KYL3R.. 我会实施并让你知道这是否成功。谢了哥们!!欢呼
  • 非常感谢@KYL3R 对图表的解释。现在真的很有意义。今晚将实施。如果有效,会及时通知您。感谢您的帮助并继续努力。干杯伴侣!!!
  • 在对图像进行解释之后,我可能会继续执行 -X 和 X 以及 -Z 和 Z 。给了我我需要的信心。 :)
  • 我认为这仍然会很好。对于用户来说,它仍然是“一键式控制”——非常简单!只有“切换”不同。但要小心随机生成平台,避免 2x2 模式或将平台放置在现有平台中。您也可以在生成时使用checkBox - 验证该位置是否空闲
  • 是的,我也考虑到了这一点。 (在生成平台时也使用它)。谢谢:)
【解决方案2】:

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

你只需要从平台spawning-script中引用player-script并通知它方向已经改变了。

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

在检查器中,您需要将玩家与 Spawing 脚本链接(在检查器中,将 Player 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()
}

【讨论】:

  • 从来没有玩过之字形,但我假设你前面会产生多个平台。所以你在平台 5 上并且你已经产生了 5 个平台。在生成第一个负 X 平台后,您的代码会切换,但距离该平台还有 5 个平台。
  • @KYL3R 实际上我试图解释他如何从生成脚本中通知玩家它应该改变方向。我需要确切地询问他何时应该进行切换,以调整代码。我不得不承认我也没玩过那个游戏。
  • 这可能仍会导致 KYL3R 所述的问题。平台生成远远领先于角色运行。所以我不能只使用分数作为切换方向的索引。 (分数是我最初的假设,但后来我意识到这是多么糟糕的主意。我刚刚发布了我的原始代码)。
  • 如果你用谷歌搜索图像,你似乎走在随机 X / Z 瓷砖的路径上,只是切换了步行方向。如果您也有 -X 平台,简单的切换将不再起作用。这就是 OP 问题发挥作用的地方。
  • @ignacio allore 说前 30 个平台是在 -x 方向生成的。所以角色在点击时移动 -x 。从 31 到 60,平台在 X 方向生成。所以第 31 个平台是应该通知角色切换的时间。
猜你喜欢
  • 2021-01-01
  • 2013-07-12
  • 1970-01-01
  • 2021-07-31
  • 2023-01-30
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多