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