我是团结的新手,并开始创建一个简单的曲折游戏。平台最初在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);
}
}
我正在复制经典之字形游戏,但也在其他方向产生平台。所以它现在看起来像原来的游戏。
答案 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才能工作。
代码:
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()
}