Sandrammmm 2018-05-02 02:48 采纳率: 0%
浏览 3055
已结题

有关Unity中多个Prefab物体绑定同一脚本出现相互影响的问题

用unity做了一个3D俄罗斯方块的游戏,七个方块都是Prefab,每个俄罗斯方块又由四个cube组成,他们都绑定了同一个脚本,该脚本实现方块的下落和合法性检测等功能。但运行时第一个方块降落后,第二个方块及往后都不能正常降落。尝试打印信息后发现,在合法性检测那里遍历transform的所有child的时候,第一个方块的child也会被包含进去;在尝试对第一个方块进行销毁(从场景中消失)后,之后的方块能正常下落,但这样就不是俄罗斯方块游戏了,有没有什么办法在不让前边的方块在场景中消失的情况下解决问题。

    private bool IsValidGridPos()
    {
        //Debug.Log(this.transform.name);
        foreach (Transform child in transform)
        {
            Debug.Log(this.transform.name);
            Debug.Log(child.name);
            Vector2 v = MyGrid.Instance.RoundVector2(child.position);
            Debug.Log("v:" + v);


            if (!MyGrid.Instance.IsInside(v))
            {
                Debug.Log("222222");
               // Debug.Log(this.gameObject.name);
                return false;
            }

            if (MyGrid.Instance.grid[(int)v.x, (int)v.y] != null && MyGrid.Instance.grid[(int)v.x, (int)v.y].parent != this.transform)
            {
               // Debug.Log(this.gameObject.name);
                return false;
            }
        }
        return true;
    }

  //方块下落
    void Fall()
    {
        if((Time.time -lastFallTime)>FindObjectOfType<Queue>().TimeFrame)
        {
            transform.position -= new Vector3(0, 1, 0);//让其下落
            Debug.Log("position:" + transform.position);
            Debug.Log(this.transform.name);

            //位置合法性检测
            if (IsValidGridPos())
            {//位置合法
                Debug.Log("合法");
                UpdateGrid();
            }
            else
            {//位置不合法,代表方块降落到底部
                Debug.Log("不合法");
                transform.position += new Vector3(0, 1, 0);

                MyGrid.Instance.DeleteFullRows();

                // GameObject.Find(objName).GetComponent<ARGroups>().enabled = false;
                //Destroy(gameObject);
                gameObject.GetComponent<ARGroups>().enabled = false;
                FindObjectOfType<Spanwer>().SpawnNext();//生成新的方块

               // grandFa = GetComponentsInChildren<Transform>();

                // enabled = false;//控制移动和选择的功能不能用了
            }

            lastFallTime = Time.time;//更新上一次下落的时间为当前时间
        }
    }
  • 写回答

5条回答 默认 最新

  • yangchenxi577 2018-05-02 03:28
    关注

    降落后的方块做检测,脚本隐藏或删除,在合法性检测子物体那里,加个获取脚本判断,第一个方块就不会包含了。

    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB yalmip 可转移负荷的简单建模出错,如何解决?
  • ¥15 数学的三元一次方程求解
  • ¥20 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?