public void Show(bool show, string iconPrefabName, UIBaseMap mapInstance, UIMapsObject regObj, System.Action <MapMarker> markerInitializer) { if (mapInstance == null) { return; } if (show) { if (mapMarker == null) { MapMarker prefab = GetMapMarkerPrefab(iconPrefabName); if (prefab != null) { mapMarker = mapInstance.AddMapMarker(prefab, regObj); if (markerInitializer != null) { markerInitializer(mapMarker); } } } } else { if (mapMarker != null) { // should set to null mapMarker = mapInstance.RemoveMapMarker(mapMarker); } } }
// protected override // void OnMarkerRemove(MapMarker marker) { // } // protected override void OnMarkerAdd(MapMarker marker) { marker.ShowMessage(false); marker.ShowDirectionals(false); marker.ShowDistance(true); marker.showRotation = false; }
// protected override void OnMarkerRemove(MapMarker marker) { // } // protected override void OnMarkerAdd(MapMarker marker) { marker.ShowMessage(false); marker.ShowDistance(false); marker.ShowDirectionals(!UIMaps.RegisteredObjectIsPlayer(marker.uIRegisteredObject)); marker.showRotation = false; }
// protected override void OnMarkerRemove(MapMarker marker) { if (selectedMarker != null) { if (marker == selectedMarker) { DeselectMarker(marker); } } }
public MapMarker RemoveMapMarker(MapMarker mapMarker) { if (mapMarkers.Contains(mapMarker)) { mapMarkers.Remove(mapMarker); mapMarker.gameObject.SetActive(false); if (onMarkerRemove != null) { onMarkerRemove(mapMarker); } } return(null); }
public MapMarker AddMapMarker(MapMarker prefab, UIMapsObject regObj) { MapMarker newMarker = markerPool.GetAvailable(prefab, null, false, null); newMarker.InitializeMapMarker(regObj); mapMarkers.Add(newMarker); newMarker.transform.SetParent(transform, Vector3.zero, Quaternion.identity, Vector3.one); newMarker.EnableMapMarker(true); UIBaseParameters.CopyParameters(ref newMarker.parameters, markerParameters); newMarker.UpdateElementLayout();//true); if (onMarkerAdd != null) { onMarkerAdd(newMarker); } newMarker.gameObject.SetActive(true); return(newMarker); }
// protected override void Update() { // base.Update(); if (!Application.isPlaying) //{ { return; } // } // if (GameManager.isInMainMenuScene) // return; if (!GameManager.playerExists) { return; } if (!isActive) { return; } // Camera playerCamera = GameManager.playerCamera; // if (playerCamera == null) // return; Actor playerActor = GameManager.playerActor; // if (playerActor == null) // return; Vector3 playerPos = playerActor.GetPosition(); baseMapParameters.UpdateMapMarkers(playerPos); Vector3 playerFwd = playerActor.GetForward(); playerFwd.y = 0; // Transform t = UIManager.GetMainCamera().transform; // if (t != null) { // Vector3 playerPos = t.position; // Vector3 playerFwd = t.forward; // playerFwd.y = 0; float playerAngle = Vector3.Angle(playerFwd, Vector3.forward); if (Vector3.Angle(playerFwd, Vector3.right) > 90) { playerAngle *= -1; } Transform parent = uiCamera.transform.parent; parent.position = playerPos + Vector3.up * uiCamera.farClipPlane * .5f; parent.rotation = Quaternion.LookRotation(playerFwd); float cameraSize = cameraArea * .5f; uiCamera.orthographicSize = cameraSize; uiCamera.Render(); Vector2 halfSize = size * .5f; for (int i = 0; i < baseMapParameters.mapMarkers.Count; i++) { MapMarker m = baseMapParameters.mapMarkers[i]; Vector3 wPos = m.GetMarkerPosition(); Vector3 lPos = parent.InverseTransformPoint(wPos); Vector2 anchorPos_unMoved = new Vector2(lPos.x / cameraSize * halfSize.x, lPos.z / cameraSize * halfSize.y); Vector2 anchorPos = anchorPos_unMoved + halfSize; bool markerEnabled = m.alwaysShowMiniMap || (anchorPos.x >= 0 && anchorPos.y >= 0 && anchorPos.x <= size.x && anchorPos.y <= size.y); if (m.alwaysShowMiniMap) { /* \ | \ x \a| panel radius \| \| \| cos (a) = panel radius / x \| cos (a) * x = panel radius \| x = panelRadius / cos(a) \| \| max angle before switching hypotenuse calculation to use width: \| \| panel x radius \| _____ \ | \ \a| panel h radius \| \| \| a = maxAngle \| tan (maxAngle) = (panel x radius) / (panel y radius) */ float maxAngle = Mathf.Atan(halfSize.x / halfSize.y) * Mathf.Rad2Deg; float adjacentSize = halfSize.y; float angle = Mathf.Atan2(anchorPos_unMoved.x, anchorPos_unMoved.y) * Mathf.Rad2Deg; angle = angle < 0 ? -angle : angle; angle = angle > (180 - maxAngle) ? 180 - angle : angle; if (angle >= maxAngle) { adjacentSize = halfSize.x; angle = angle > 90 ? (angle - 90) : (90 - angle); } float hypotenuse = adjacentSize / Mathf.Cos(angle * Mathf.Deg2Rad); anchorPos_unMoved = Vector2.ClampMagnitude(anchorPos_unMoved, hypotenuse); anchorPos = anchorPos_unMoved + halfSize; } m.EnableMapMarker(markerEnabled); if (markerEnabled) { m.rectTransform.anchoredPosition = anchorPos; if (m.showRotation) { if (m.mainGraphic != null) { Vector3 fwd = m.GetMarkerForward(); fwd.y = 0; float angle = Vector3.Angle(fwd, Vector3.forward); if (Vector3.Angle(fwd, Vector3.right) > 90) { angle *= -1; } m.mainGraphic.rectTransform.localRotation = Quaternion.Euler(0, 0, -angle + playerAngle); } } } } // } }
// protected override void Update() { // base.Update(); if (!Application.isPlaying) { return; } if (!GameManager.playerExists) { return; } if (!isActive) { return; } Actor playerActor = GameManager.playerActor; // if (playerActor == null) // return; Vector3 playerPos = playerActor.GetPosition(); baseMapParameters.UpdateMapMarkers(playerPos); Vector3 playerFwd = playerActor.GetForward(); playerFwd.y = 0; Vector3 playerRight = Vector3.Cross(playerFwd, Vector3.up); // set position of icons based on angle with camera // Transform playerTransform = UIManager.GetMainCamera().transform; // Vector3 playerPosition = playerTransform.position; // Vector3 playerFwd = playerTransform.forward; // Vector3 playerRight = playerTransform.right; // playerFwd.y = 0; // playerRight.y = 0; float halfSize = size.x * .5f; float maxAngle = angleRange + outOfAngleBuffer; for (int i = 0; i < baseMapParameters.mapMarkers.Count; i++) { MapMarker m = baseMapParameters.mapMarkers[i]; Vector3 dir = m.GetMarkerPosition() - playerPos; float distance = dir.magnitude; // angle goes to zero the closer the object is, so close markers dont jump around compass float mult = Mathf.Pow(distance / distanceBuffer, distanceBufferSteepness); if (mult > 1) { mult = 1; } dir.y = 0; float angleWFwd = Vector3.Angle(playerFwd, dir) * mult; bool markerEnabled = (angleWFwd <= maxAngle); m.EnableMapMarker(markerEnabled); if (markerEnabled) { float t = angleWFwd / angleRange; if (t > 1) { t = 1; } bool toRight = Vector3.Angle(playerRight, dir) < 90; m.rectTransform.anchoredPosition = new Vector2(t * (toRight ? halfSize : -halfSize), 0); } } }
void Update() { base.Update(); if (!Application.isPlaying) { return; } if (!isActive) { return; } if (!GameManager.playerExists) { return; } baseMapParameters.UpdateMapMarkers(GameManager.playerActor.GetPosition()); zoom -= UIInput.mouseScrollDelta.y * zoomSpeed * Time.deltaTime; zoom = Mathf.Clamp(zoom, 1, maxZoom); float z = 1f / zoom; float speed = moveSpeed * Time.deltaTime * z; float inputX = UIInput.GetHorizontalAxis(); float inputY = UIInput.GetVerticalAxis(); if (unsnapProhibit) { if (inputX == 0 && inputY == 0 || Time.time - snappedTime >= unsnapTime) { unsnapProhibit = false; } inputX = 0; inputY = 0; } move.x = Mathf.Clamp(move.x + inputX * speed, -.5f, .5f); move.y = Mathf.Clamp(move.y + inputY * speed, -.5f, .5f); float zOffset = (-0.5f) * z + 0.5f; Vector2 move2 = move * 2; float halfMapUI = mapSize * .5f; float halfMapUIZoom = halfMapUI * zoom; for (int k = 0; k < baseMapParameters.mapMarkers.Count; k++) { // foreach (var k in mapMarkers.Keys) { MapMarker m = baseMapParameters.mapMarkers[k]; Vector3 wPos = m.GetMarkerPosition(); Vector2 uiPos = (((new Vector2(wPos.x, wPos.z) - mapCenter) / mapRadius) - move2) * halfMapUIZoom; bool markerEnabled = uiPos.x <= halfMapUI && uiPos.x >= -halfMapUI && uiPos.y <= halfMapUI && uiPos.y >= -halfMapUI; m.EnableMapMarker(markerEnabled); if (markerEnabled && uiPos.sqrMagnitude <= snapDist) { if (selectedMarker == null) // && (markerToSelect == null || markerToSelect == currentWaypointMarker)) { // markerToSelect = m; { move += (uiPos / halfMapUI) / 2 * z; uiPos = Vector2.zero; // // move.x += (uiPos.x / halfMapUI)/2 * z; // // move.y += (uiPos.y / halfMapUI)/2 * z; unsnapProhibit = true; snappedTime = Time.time; SelectMarker(m); } } else { if (selectedMarker == m) { DeselectMarker(m); } } if (markerEnabled) { if (m.showRotation) { if (m.mainGraphic != null) { Vector3 fwd = m.GetMarkerForward(); fwd.y = 0; float angle = Vector3.Angle(fwd, Vector3.forward); if (Vector3.Angle(fwd, Vector3.right) > 90) { angle *= -1; } m.mainGraphic.rectTransform.localRotation = Quaternion.Euler(0, 0, -angle); } } m.rectTransform.anchoredPosition = uiPos; } } mapImage.uvRect = new Rect(move.x + zOffset, move.y + zOffset, z, z); if (UIInput.GetSubmitDown()) { AddWaypoint(zOffset); } }
void DeselectMarker(MapMarker marker) { ShowExtras(marker, false); selectedMarker = null; }
void SelectMarker(MapMarker marker) { ShowExtras(marker, true); selectedMarker = marker; }
// protected override void OnMarkerAdd(MapMarker marker) { ShowExtras(marker, false); marker.ShowDirectionals(false); }
void ShowExtras(MapMarker marker, bool show) { marker.ShowMessage(show); marker.ShowDistance(show); }
// protected override void Update() { // base.Update(); if (!Application.isPlaying) { return; } if (!GameManager.playerExists) { return; } // if (GameManager.isInMainMenuScene) // return; baseMapParameters.UpdateMapMarkers(GameManager.playerActor.GetPosition()); Camera playerCamera = GameManager.playerCamera; if (playerCamera == null) { return; } if (!isActive) { return; } if (UIMainCanvas.instance == null) { return; } float borderOffset = baseMapParameters.markerParameters.iconSize * transform.localScale.x * 2; Vector2 fullSize = ((UIMainCanvas.instance.rectTransform.sizeDelta - Vector2.one * borderOffset) / transform.localScale.x); Vector2 halfSize = fullSize * .5f; for (int i = 0; i < baseMapParameters.mapMarkers.Count; i++) { MapMarker m = baseMapParameters.mapMarkers[i]; Vector3 worldPos = m.GetMarkerPosition(); Vector3 screenPos = playerCamera.WorldToViewportPoint(worldPos); if (screenPos.z < 0) { screenPos.x = 1f - screenPos.x; screenPos.y = 0; } else { screenPos.y = Mathf.Clamp01(screenPos.y); } Vector2 pos = new Vector2( screenPos.x * fullSize.x - halfSize.x, screenPos.y * fullSize.y - halfSize.y ); /* \ | \ x\a| panel radius \| \| \| cos (a) = panel radius / x \| cos (a) * x = panel radius \| x = panelRadius / cos(a) \| \| max angle before switching hypotenuse calculation to use width: \| \| panel x radius \| _____ \ | \ \a| panel h radius \| \| \| a = maxAngle \| tan (maxAngle) = (panel x radius) / (panel y radius) */ float maxAngle = Mathf.Atan(halfSize.x / halfSize.y) * Mathf.Rad2Deg; float adjacentSize = halfSize.y; float angle = Mathf.Atan2(pos.x, pos.y) * Mathf.Rad2Deg; angle = angle < 0 ? -angle : angle; angle = angle > (180 - maxAngle) ? 180 - angle : angle; if (angle >= maxAngle) { adjacentSize = halfSize.x; angle = angle > 90 ? (angle - 90) : (90 - angle); } float hypotenuse = adjacentSize / Mathf.Cos(angle * Mathf.Deg2Rad); /* \ | \ x \a| <-panel radius \| \| \| cos (a) = panel radius / x -> \| cos (a) * x = panel radius -> \| x = panelRadius / cos(a) */ // float angle = Mathf.Atan2(pos.x, pos.y) * Mathf.Rad2Deg; // angle = angle < 0 ? -angle : angle; // angle = angle > 135 ? angle - 90 : angle; // float adjacentSize = halfSize.y; // if (angle >= 45) { // angle = angle > 90 ? (angle - 90) : (90 - angle); // adjacentSize = halfSize.x; // } // float hypotenuse = (adjacentSize / Mathf.Cos(angle * Mathf.Deg2Rad)); pos = Vector2.ClampMagnitude(pos, hypotenuse); m.rectTransform.anchoredPosition = pos; } }