예제 #1
0
    private void UpdateGuideArrows()
    {
        if (0 == _mGuideArrowList.Count)
        {
            return;
        }

        // Define the Screen Rect
        Rect screenRect = new Rect();

        float w = Screen.width * 0.7f;
        float h = Screen.height * 0.7f;

        // Adjust the startPoint(left-bottom)
        screenRect.xMin = (Screen.width - w) * 0.5f;
        screenRect.yMin = (Screen.height - h) * 0.5f;

        screenRect.width  = w;
        screenRect.height = h;

        Vector3 intersectPoint = Vector3.zero;

        foreach (MonsterFleet key in _mGuideArrowList.Keys)
        {
            GameObject go = _mGuideArrowList[key];

            // tzz added
            // to fix http://pms.mappn.com/index.php?m=bug&f=view&bugID=5726
            Vector3 t_monsterFleetCamDir = key.Position - Globals.Instance.MSceneManager.mMainCamera.transform.position;
            float   t_dot = Vector3.Dot(t_monsterFleetCamDir.normalized, Globals.Instance.MSceneManager.mMainCamera.transform.forward.normalized);

            Vector3 screenPos2;

            if (t_dot <= 0.001)
            {
                // tzz modified
                // the monster fleet is back of camera
                //
                Vector3    t_cross    = Vector3.Cross(Globals.Instance.MSceneManager.mMainCamera.transform.forward, t_monsterFleetCamDir).normalized;
                Quaternion t_rotation = Quaternion.AngleAxis(-(Mathf.Abs(t_dot) + 0.5f) * Mathf.Rad2Deg, t_cross);
                t_monsterFleetCamDir = t_rotation * t_monsterFleetCamDir + Globals.Instance.MSceneManager.mMainCamera.transform.position;

                screenPos2 = Globals.Instance.MSceneManager.mMainCamera.WorldToScreenPoint(t_monsterFleetCamDir);
            }
            else
            {
                screenPos2 = Globals.Instance.MSceneManager.mMainCamera.WorldToScreenPoint(key.Position);
            }

            Vector3 screenPos1 = Globals.Instance.MSceneManager.mMainCamera.WorldToScreenPoint(_mActorFleet.Position);

            if (HelpUtil.Intersect(screenRect, screenPos1, screenPos2, out intersectPoint))
            {
                // tzz add for set visible of indicator
                go.SetActiveRecursively(true);

                // Convert to GUI Space
                intersectPoint   = GUIManager.ScreenToGUIPoint(intersectPoint);
                intersectPoint.z = GUIManager.GUI_FARTHEST_Z;

                // if (Vector3.Dot(Globals.Instance.MSceneManager.mMainCamera.transform.forward, key.Position - Globals.Instance.MSceneManager.mMainCamera.transform.position) < 0.0f)
                // {
                //  intersectPoint = GUIManager.GUIToScreenPoint(intersectPoint);
                //
                //  intersectPoint.x = Screen.width - intersectPoint.x;
                //  intersectPoint.y = Screen.height - intersectPoint.y;
                // }

                // Convert to GUI Space
                screenPos1   = GUIManager.ScreenToGUIPoint(screenPos1);
                screenPos1.z = GUIManager.GUI_FARTHEST_Z;

                // Calculate the direction
                Vector3    dir    = intersectPoint - screenPos1;
                Quaternion rotate = Quaternion.FromToRotation(Vector3.right, dir);
                go.transform.localRotation = rotate;

                // Calculate the offset position according to he PackedSprite's size
                Vector3      position = intersectPoint;
                PackedSprite sprite   = go.GetComponent <PackedSprite>() as PackedSprite;
                if (dir.x < 0)
                {
                    if (null != sprite)
                    {
                        position.x += sprite.width * 0.5f;
                    }
                    else
                    {
                        position.x += 32.0f;
                    }
                }
                else
                {
                    if (null != sprite)
                    {
                        position.x -= sprite.width * 0.5f;
                    }
                    else
                    {
                        position.x -= 32.0f;
                    }
                }

                if (dir.y < 0)
                {
                    if (null != sprite)
                    {
                        position.y += sprite.height * 0.5f;
                    }
                    else
                    {
                        position.y += 32.0f;
                    }
                }
                else
                {
                    if (null != sprite)
                    {
                        position.y -= sprite.height * 0.5f;
                    }
                    else
                    {
                        position.y -= 32.0f;
                    }
                }

                // set the z position above GUIMain
                position.z = GUIManager.GUI_NEAREST_Z + 200;

                // Auto scale
                position.x *= Globals.Instance.M3DItemManager.EZ3DItemParentScaleInv.x;
                position.y *= Globals.Instance.M3DItemManager.EZ3DItemParentScaleInv.y;
                go.transform.localPosition = position;
            }
            else
            {
                // tzz add for set visible of indicator
                go.SetActiveRecursively(false);
            }
        }
    }