Example #1
0
    public void ApplyPhysicsSingle(Vector3 center, float range, Vector3 towards)  //应用物理破坏
    {
        if (!supportphysic)
        {
            return;
        }

        Vector3 vtotallen = vsize;

        vtotallen.y = 0.0f;
        float ftotallen = vtotallen.magnitude;

        foreach (DictionaryEntry keypair in groups)
        {
            int           key = (int)keypair.Key;
            AdorningGroup ag  = (AdorningGroup)keypair.Value;

            Vector3 vdir = center - ag.pos;
            vdir.y = 0.0f;
            float flen = vdir.magnitude;

            bool bOK = flen < range;
            if (bOK)
            {
                ag.ApplyPhysics(center, range, towards);
                animedgroups.Add(ag);
            }
        }
    }
Example #2
0
    public void Update()
    {
        GameObject gohero = EntityFactory.MainHero;

        if (gohero != null)
        {
            Vector3 vhero = gohero.transform.position;
            if (SoldierCamera.MainInstance <SoldierCamera>() != null && SoldierCamera.MainInstance <SoldierCamera>().cameraMode == CameraMode.MapGodControl)
            {
                vhero = CameraUtil.GetGodEyePos();
            }
            Vector3 vtotallen = vsize;
            vtotallen.y = 0.0f;
            float ftotallen = vtotallen.magnitude;
            float fvislen   = ftotallen * VisFactor;

            foreach (DictionaryEntry keypair in groups)
            {
                int           key = (int)keypair.Key;
                AdorningGroup ag  = (AdorningGroup)keypair.Value;

                Vector3 vdir = vhero - ag.pos;
                vdir.y = 0.0f;
                float flen = vdir.magnitude;

                bool bVis = flen < fvislen;
                ag.SetVisable(bVis, 0.1f, FadeTime, FadeEnable);
            }
        }
    }
Example #3
0
    public AdorningGroup GetGroup(int x, int y)
    {
        int key = GetKeyByGroup(x, y);

        if (groups.ContainsKey(key))
        {
            AdorningGroup ag = (AdorningGroup)groups[key];
            return(ag);
        }
        else
        {
            return(null);
        }
    }
Example #4
0
    public static bool IsLoad(Vector3 pos)
    {
        bool ret = false;

        foreach (AdorningManager am in Instances)
        {
            AdorningGroup ag = am.GetGroup(pos);
            if (ag != null)
            {
                if (ag.loaded == true)
                {
                    ret = true;
                    break;
                }
            }
        }
        return(ret);
    }
Example #5
0
    public void Build()
    {
        //RenderSettings.fog = false;
        //RenderSettings.fogColor = new Color(112.0f / 255.0f, 127.0f / 255.0f, 131.0f / 255.0f);
        //RenderSettings.fogStartDistance = 25.0f;
        //RenderSettings.fogEndDistance = 125.0f;

        //这里要先加到一个临时列表,因为新生成的groupobj也是当前gameobject.transform的子对象
        List <Transform> objs = new List <Transform>();
        //Renderer[] mrs = transform.GetComponentsInChildren<Renderer>();
        //if (mrs == null)
        //{
        //    return;
        //}
        //int n = mrs.Length;
        //for (int i = 0; i < n; i++)
        //{
        //    Transform tchild = mrs[i].transform;
        //    objs.Add(tchild);
        //}

        int n = transform.childCount;

        for (int i = 0; i < n; i++)
        {
            Transform tchild = transform.GetChild(i);
            if (tchild.lossyScale.x > 0.1f && tchild.lossyScale.z > 0.1f)//对于缩放系数为负的物件只能整体处理,unity对于缩放为负处理可能有bug
            {
                Renderer[] mrs = tchild.GetComponentsInChildren <Renderer>();
                foreach (Renderer mr in mrs)
                {
                    objs.Add(mr.transform);
                }
            }
            else
            {
                objs.Add(tchild);
            }
        }

        //对临时列表中的对象进行分组
        Hashtable groupobjs = new Hashtable();

        for (int i = 0; i < objs.Count; i++)
        {
            Transform    tchild = objs[i];
            Vector3      pos    = tchild.position;
            MeshRenderer mr     = tchild.gameObject.GetComponent <MeshRenderer>();
            if (mr != null && mr.bounds != null)
            {
                pos = mr.bounds.center;
            }
            Vector3 vrelate = pos - vmin;
            int     x       = (int)(vrelate.x / vdistance.x);
            int     y       = (int)(vrelate.z / vdistance.z);

            x -= groupsize;
            y -= groupsize;

            if (x < -groupsize)
            {
                x = -groupsize;
            }
            if (y < -groupsize)
            {
                y = -groupsize;
            }
            if (x > groupsize)
            {
                x = groupsize;
            }
            if (y > groupsize)
            {
                y = groupsize;
            }

            GameObject gogroup = null;
            int        key     = GetKeyByGroup(x, y);
            if (!groupobjs.ContainsKey(key))
            {
                gogroup        = CreateGroup(x, y);
                groupobjs[key] = gogroup;
            }
            else
            {
                gogroup = (GameObject)groupobjs[key];
            }

            tchild.parent = gogroup.transform;
        }

        // 对分组对象构建AdorningGroup脚本
        foreach (DictionaryEntry keypair in groupobjs)
        {
            int        key     = (int)keypair.Key;
            GameObject gogroup = (GameObject)keypair.Value;

            int stride = groupsize * 2 + 1;
            int x      = key % stride;
            int y      = key / stride;

            AdorningGroup ag = gogroup.AddComponent <AdorningGroup>();
            ag.x        = x - groupsize;
            ag.y        = y - groupsize;
            ag.pos      = gogroup.transform.position;
            groups[key] = ag;
        }

        // 合并每个分组中的网格,减少批次
        foreach (DictionaryEntry keypair in groups)
        {
            int           key = (int)keypair.Key;
            AdorningGroup ag  = (AdorningGroup)keypair.Value;
            //ag.Combine();
        }

        // 加到列表
        foreach (DictionaryEntry keypair in groups)
        {
            int           key     = (int)keypair.Key;
            AdorningGroup ag      = (AdorningGroup)keypair.Value;
            GameObject    gogroup = ag.gameObject;

            for (int i = 0; i < gogroup.transform.childCount; i++)
            {
                Transform tchild   = gogroup.transform.GetChild(i);
                Adorning  adorning = tchild.gameObject.AddComponent <Adorning>();
                adorning.alpha = 2.0f;
                ag.objs.Add(adorning);
            }
        }

        //最后处理没分组的
        List <Transform> ungrouplist = new List <Transform>();

        for (int i = 0; i < transform.childCount; i++)
        {
            Transform tchild = transform.GetChild(i);
            if (tchild.gameObject.GetComponent <AdorningGroup>() == null)
            {
                ungrouplist.Add(tchild);
            }
        }
        GameObject ungroupparent = new GameObject("ungroup");

        ungroupparent.transform.parent = transform;
        foreach (Transform tchild in ungrouplist)
        {
            tchild.parent = ungroupparent.transform;
        }
    }