首页 文章

如何在实例化对象后面设置不同的属性? [关闭]

提问于
浏览
0

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

Spheres

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

Instantiating spheres

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

2 回答

  • 0

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

    • 为该GameObject添加一个名为 boolean hasBomb 的布尔变量

    • 当您在场景中实例化10个球体时,将该布尔值随机设置为true或false

    • 可选 - 如果您还要添加炸弹预制件,可以在球体的相同位置实例化它们,其中hasBomb属性设置为true

    • 在球体的 onClick() 方法中,检查(hasBomb)是否设置为true

    • 如果是,则使用文本或菜单加载一个名为GameOver的新场景 . 使用 Application.LoadLevel("GameOver"

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

    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是你在编辑器中创建的gameObject . 因此,不是将gameObject标记为“sphere”以便稍后检测是否使用Physics.Raycast按下按钮,您可以做的是创建一个名为hideSphere.cs的脚本 . 在该脚本中,您应该添加:

    public boolean hasBomb;
    

    并且

    function OnMouseDown()
    {
      if(hasBomb)
         Application.LoadLevel("GameOver")
    
      renderer.enabled = false;
      //Or
      //Destroy(gameObject);
    }
    

    然后你应该:

    • 将一个对撞机添加到gola GameObject(因此它会检测到点击次数)

    • 将脚本hideSphere.cs附加到gola GameObject

    编辑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.<hideSphere>().hasBomb = true; 行可以访问变量hasBomb,它是脚本hideSphere.cs中的一个公共变量,它附加到GameObject gola . 但在这种情况下,您只需修改当前迭代中生成的特定实例的该属性 .

  • 0

    你把你的炸弹放在球形儿童身上 . 当用户点击球体时,您会检查您的对象是否有一个名为“炸弹”的子项 .

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

相关问题