【问题标题】:How to set different properties behind instantiated objects? [closed]如何在实例化对象后面设置不同的属性? [关闭]
【发布时间】:2017-08-21 06:32:12
【问题描述】:

我正在使用 Unity C# 制作一个游戏,其中在游戏开始时实例化了 10 个球体。当用户单击任何球体时,球体使用 set active false 属性隐藏。现在我想要在一些球体后面放置炸弹,这样当用户点击后面有炸弹的球体时,游戏就结束了。

球体

List<GameObject> hat;
float q, w, r;
public Spheres()
{
    hat = new List<GameObject>();
    q = -2.5f;w = -2.5f;r = -2.5f;
}

public void AddSphere(GameObject gola)
{
    for (int i = 0; i < 5; i++)
    {
        GameObject abc = GameObject.Instantiate (gola);
        abc.transform.position = new Vector3 (abc.transform.position.x + q, abc.transform.position.y, abc.transform.position.z + 1.5f);
        hat.Add (abc); q += 1.15f;
    } 
}   

public void HideSphere()
{
    if(Input.GetMouseButtonDown(0))
    {
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);     
        RaycastHit hit;
        if (Physics.Raycast (ray, out hit))
        {
            if (hit.transform.gameObject.CompareTag ("Sphere"))
            {
                hit.transform.gameObject.SetActive (false);
            }
        }
    }
}

实例化球体

for (int i = 0; i < 5; i++) 
{
    GameObject abc = GameObject.Instantiate (gola);
    abc.transform.position = new Vector3 (abc.transform.position.x + q, abc.transform.position.y, abc.transform.position.z + 1.5f);
    hat.Add (abc); q += 1.15f;
}

【问题讨论】:

  • 欢迎来到 Stack Overflow!这不是一个人们为您编写代码以便您不必编写代码的网站。如果您需要帮助调试您编写的代码,您必须发布Minimal, Complete, and Verifiable example 并解释您的代码的具体问题。
  • 你的问题只是如何做一堆东西。你必须具体。您可以通过关注他们的项目tutorials 来开始学习 Unity。
  • 其他人所说的外加:阅读How to Ask,了解如何改进您的问题(以及避免否决/关闭投票)。
  • 从一个球体开始,点击隐藏它,隐藏甚至爆炸炸弹意味着显示图像或动画。
  • for (int i = 0; i

标签: c# arrays unity3d instantiation


【解决方案1】:

由于您尚未添加任何代码,我将向您解释我将如何处理您的问题。我假设您已经为球体创建了一个 GameObject,该球体附加了一个脚本,该脚本停用 GameObeject 或使其在 onClick() 上不可见。所以现在要遵循的步骤是:

  1. 向名为boolean hasBomb的游戏对象添加一个布尔变量
  2. 在场景中实例化 10 个球体时,随机设置 布尔值是真还是假
  3. 可选 - 如果您还想添加炸弹预制件,您可以 在有炸弹的球体的相同位置实例化它们 属性设置为 true
  4. 在球体的onClick() 方法中检查是否(hasBomb)设置为 是的
  5. 如果是这样,您可以加载一个名为 GameOver 的带有文本或菜单的新场景。使用Application.LoadLevel("GameOver")

使用您在 cmets 中提供的代码进行编辑:

List<GameObject> hat; 
float q, w, r; 

public Spheres() {     
    hat = new List<GameObject>();
    q = -2.5f;
    w = -2.5f;
    r = -2.5f; 
} 

public void AddSphere(GameObject gola) {    
    for (int i = 0; i < 5; i++) { 
        GameObject abc = GameObject.Instantiate (gola); 
        abc.transform.position = new Vector3 (abc.transform.position.x + q, abc.transform.position.y, abc.transform.position.z + 1.5f); 
        hat.Add (abc); 
        q += 1.15f; 
    }     
}

public void HideSphere() {     
    if(Input.GetMouseButtonDown(0)) {     
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); 
        RaycastHit hit; 

        if (Physics.Raycast (ray, out hit)) { 
            if (hit.transform.gameObject.CompareTag ("Sphere")) {     
                hit.transform.gameObject.SetActive (false);     
            }     
        }     
    }     
} 

我假设 gola 是您在编辑器中创建的游戏对象。因此,与其将那个游戏对象标记为“球体”以稍后检测您是否使用 Physics.Raycast 的按钮按下它,您可以做的是创建一个名为 hideSphere.cs 的脚本。在该脚本中,您应该添加:

public boolean hasBomb;

还有

function OnMouseDown()
{
  if(hasBomb)
     Application.LoadLevel("GameOver")

  renderer.enabled = false;
  //Or
  //Destroy(gameObject);
}

那么你应该:

  1. 为 gola 游戏对象添加一个碰撞器(因此它可以检测点击)
  2. 将脚本 hideSphere.cs 附加到 gola 游戏对象

编辑 2:

现在随机决定球体是否有炸弹:

GameObject abc = GameObject.Instantiate (gola); 
abc.transform.position = new Vector3 (abc.transform.position.x + q, abc.transform.position.y, abc.transform.position.z + 1.5f); 

//Here we decide if it has a Bomb or not
float chance = Random.Range(0.0f, 1.0f);
if(chance > 0.75f)
 abc.GetComponent.<hideSphere>().hasBomb = true;

hat.Add (abc);

注意:通过abc.GetComponent.&lt;hideSphere&gt;().hasBomb = true; 行可以访问变量hasBomb,它是脚本hideSphere.cs 中的公共变量,附加到GameObject gola。但在这种情况下,您只需为当前迭代中生成的特定实例修改该属性。

【讨论】:

  • 我已将脚本附加到主摄像机,并使用球体预制件作为原始对象进行实例化。所以,你的意思是说我应该添加一个带有球体预制的布尔值。但是我怎么能随机设置那个布尔值是真还是假呢?来自督察?还是使用脚本?但是如果使用脚本,那该怎么做呢?!
  • 好的,我会尝试将该部分添加到我的答案中
  • 等待中......!!!!
  • 对不起,我在办公室,我可以在空闲时间回复
  • 你了解它的工作原理吗?
【解决方案2】:

你如何放置你的炸弹球体孩子。 例如,当用户单击球体时,您会检查您的对象是否有一个名为“炸弹”的子对象。

void OnClick()
{
    if (transform.Find("bomb" != null))
    {
        //gameover 
    }
    else
    {
    gameobject.SetActive(false);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多