Перемещение камеры в место клика на миникарте

Программирование на Юнити.

Перемещение камеры в место клика на миникарте

Сообщение garyn11 20 авг 2020, 18:48

Здравствуйте, не могу найти решение своей проблемы. Сама суть в заголовке.
Мини карта сделана с помощью Raw Image, отображающий Render Texture. Накопал скрипт в инете:
Синтаксис:
Используется csharp
    public enum Mode { topLeft = 0, topRight = 1, bottomLeft = 2, bottomRight = 3 };
    public Mode minimapMode = Mode.bottomLeft;
    public float zoom = 10;

    bool isMouseEnter = false;

     public void MouseEnterOrNot(bool isMouse)
    {
        isMouseEnter = isMouse;
    }

    void SetWorldPosition()
    {
        mouse = Input.mousePosition;
        float X = 0;
        float Y = 0;

        X = rawImageTransform.anchoredPosition.x - rawImageTransform.sizeDelta.x / 2;
        Y = rawImageTransform.anchoredPosition.y - rawImageTransform.sizeDelta.y / 2;

        switch (minimapMode)
        {
            case Mode.topLeft:
                Y += Screen.height;
                break;
            case Mode.topRight:
                X += Screen.width;
                Y += Screen.height;
                break;
            case Mode.bottomRight:
                X += Screen.width;
                break;
        }

        curPos = new Vector3(mouse.x - X, mouse.y - Y, 0);

        X = rawImageTransform.sizeDelta.x / 2;
        Y = rawImageTransform.sizeDelta.y / 2;
        Vector3 pos = new Vector3((curPos.x - X) / zoom, 0, (curPos.y - Y) / zoom);
       
        Camera.main.transform.position = pos;
    }

 private void Update()
    {
        if (isMouseEnter)
        {
            if (Input.GetMouseButtonDown(0) )
            {
                SetWorldPosition();
            }
        }
    }
 


Собственно так, при наведении мышки на Raw Image isMouseEnter = true и перемещаемся, проблема в том, что перемещение происходит не так, как нужно, сильно зависит от zoom, который можно настроить методом тыка в редакторе, но все сразу меняется, когда изменяется разрешение экрана, вот тогда перемещение становится вообще странным.
Сразу второй вопрос, мне нужно отобразить на миникарте границу вида основной камеры. На это я вообще не нашел ответ.
Может есть еще решения? Спасибо.
garyn11
UNец
 
Сообщения: 15
Зарегистрирован: 01 мар 2015, 19:26

Re: Перемещение камеры в место клика на миникарте

Сообщение Jarico 20 авг 2020, 18:57

Зачем делать камеру для миникарты? Можно же просто повторять координаты на миникарте в пропорции (во сколько-то раз уменьшить координаты сцены) и тогда будет удобно переносить позицию из реальной сцены в миникарту и обратно

Скрипт конечно для 3D-скайбокса но принцип один и тот же
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SkyboxCam : MonoBehaviour
{
    public Transform playerCam;

    public float proportionality;

    private Vector3 startPos;
    // Start is called before the first frame update
    void Start()
    {
        startPos = transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        transform.position = startPos + playerCam.position * proportionality;
        transform.rotation = playerCam.rotation;
    }
}

 
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Перемещение камеры в место клика на миникарте

Сообщение garyn11 20 авг 2020, 20:05

Мини карта схематично отображает сцену и элементы, которые нужно отображать только на карте, поэтому отказ от второй камеры невозможен.
garyn11
UNец
 
Сообщения: 15
Зарегистрирован: 01 мар 2015, 19:26

Re: Перемещение камеры в место клика на миникарте

Сообщение garyn11 21 авг 2020, 10:12

Ну что ребят? Неужели никто не делал мини карту с такими функциями. Готов обсудить сумму за готовый скрипт в личке.
garyn11
UNец
 
Сообщения: 15
Зарегистрирован: 01 мар 2015, 19:26

Re: Перемещение камеры в место клика на миникарте

Сообщение myxamor0 21 ноя 2021, 21:34

Я конечно понимаю что тема старая но вопрос есть. Как нарисовать прямоугольник на миникарте (сделаной на RawImage при помощи Render Texture), который показывает границы обзора, с учетом того что камера может вращаться???
myxamor0
UNец
 
Сообщения: 3
Зарегистрирован: 21 ноя 2021, 18:45

Re: Перемещение камеры в место клика на миникарте

Сообщение myxamor0 21 ноя 2021, 21:53

Ну и раз уж я влез, мой ответ на изначальный вопрос. Я капитально так заколхозил ибо мало чего соображаю. Я перемещение делал так:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class minimap : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerClickHandler
{
        public GameObject _mainCamera; // моя главная камера вставлена дочерним обьектом в пустой обьект. Эта переменная эта этот обьект. На него повешен скрипт CameraController.cs который отвечает за движение камеры отслеживая положение мыши или нажатые клавиши движения камеры. Новые координаты камеры он записывает в переменную newPosition. Туда я и буду передавать координаты в которые нужно смещать камеру
        public RawImage _minimap;
        private bool movecam;  // переменные разрешающие движение карты или простановки метки и т.д.
        private bool minimaptarget;
        private bool moveunit;
        private float X = 0; // собственно координаты означающие место клика в глобальном мире
        private float Y = 0;
        public  float stepx = 0; //переменные отвечающие за смещение камеры для того что бы точка обзора была в середине прямоугольника
        public  float stepy = 0;
        public bool PlayerTargetCam;    // переменная для проверки надо ли следить камере за игроком
                       
    // Start is called before the first frame update
    void Start()
    {
        movecam=false;
                PlayerTargetCam = false;               
                _mainCamera.GetComponent<CameraController>().PlayerTargetCam = false;
                //определение смещения от центра
                //выставляем маску слоев что бы пускать лучи только в террейн. Что бы точка в которую смотрит камера всегда была по середине прямоугольника
                int cubeLayerIndex = LayerMask.NameToLayer("Terrain");
                if (cubeLayerIndex == -1)
                {
                        Debug.LogError("Layer Does not exist");
                }
                else
                {
                        int layerMask = (1 << cubeLayerIndex);
                        Vector3 point3 = new Vector3(0, 0, 0);
                        Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2, Screen.height/2, 0));
                        RaycastHit hitInfo;
                        if ((Physics.Raycast(ray.origin, ray.direction, out hitInfo, 1000,layerMask)) )
                        {
                                point3 = hitInfo.point;
                                stepx = point3.x - _mainCamera.transform.position.x;
                                stepy = point3.z - _mainCamera.transform.position.z;
                        }
                }
    }
       
       
        void Update()
    {
                //смещаем камеру
                if (movecam)
                {
                        GetPosition();
                        _mainCamera.GetComponent<CameraController>().newPosition.x = X;
                        _mainCamera.GetComponent<CameraController>().newPosition.z = Y;                
        }
                //проверяем нажата ли кнопка контрал для простановки метки
                if(Input.GetKeyDown(KeyCode.LeftControl))
                {
                        minimaptarget = true;
                }
                if(Input.GetKeyUp(KeyCode.LeftControl))
                {
                        minimaptarget = false;
                }
        //возвращаем камеру к игроку или следим за игроком
        if ( (Input.GetKey(KeyCode.Space)) || (PlayerTargetCam==true) )
        {
                        var objects =  GameObject.FindGameObjectsWithTag ("Player");
                        GameObject lad;                
                        if(objects != null && objects.Length > 0)
                        {
                                lad = objects[0];
                                X = lad.transform.position.x - stepx;
                                Y = lad.transform.position.z - stepy;
                                checkPosition();
                                _mainCamera.GetComponent<CameraController>().newPosition.x = X;
                                _mainCamera.GetComponent<CameraController>().newPosition.z = Y;
                        }
        }
                _mainCamera.GetComponent<CameraController>().PlayerTargetCam = PlayerTargetCam;
    }
       

    // проверка нажатия на кнопку мышки
   public void OnPointerDown(PointerEventData eventData)
    {
        if((eventData.button == PointerEventData.InputButton.Left) && (minimaptarget))
        {
                        //ставим метку на карте
        }
        else if(eventData.button == PointerEventData.InputButton.Left)
        {
                        movecam=true;
        }
        else if(eventData.button == PointerEventData.InputButton.Right)
        {
                        //по правому клику смещаем юнитов
                        GetPosition();
                        Vector3 targetPosition = new Vector3(X, 0.0f, Y);
                        movement.UpdateTargets(targetPosition); //отдельный скрипт отвечающий за движение, передаем координаты туда
        }
       
    }
       
    // проверка отпускания на кнопку мышки
   public void OnPointerUp(PointerEventData eventData)
    {
        if(eventData.button == PointerEventData.InputButton.Left)
        {
                        movecam=false;
        }
       
    }
       
    // проверка клика на кнопку мышки
   public void OnPointerClick(PointerEventData eventData)
    {
       
    }
       
    // получение координат реальных по отношению к миникарте
        public void GetPosition()
    {  
                Vector3 mousePos =Input.mousePosition;
                X=1000 /_minimap.rectTransform.rect.width * mousePos.x - stepx; // здесь 1000 это размер моего террейна
                Y=1000/_minimap.rectTransform.rect.height * mousePos.y - stepy;// здесь 1000 это размер моего террейна
                checkPosition();
                }
       
        public void checkPosition()
    {
                if (X<_mainCamera.GetComponent<CameraController>()._minXCamMovement)
                {
                        X=_mainCamera.GetComponent<CameraController>()._minXCamMovement;
                }
                if (X>_mainCamera.GetComponent<CameraController>()._maxXCamMovement)
                {
                        X=_mainCamera.GetComponent<CameraController>()._maxXCamMovement;
                }
                if (Y<_mainCamera.GetComponent<CameraController>()._minZCamMovement)
                {
                        Y=_mainCamera.GetComponent<CameraController>()._minZCamMovement;
                }
                if (Y>_mainCamera.GetComponent<CameraController>()._maxZCamMovement)
                {
                        Y=_mainCamera.GetComponent<CameraController>()._maxZCamMovement;
                }      
    }
       
       
}

 
myxamor0
UNец
 
Сообщения: 3
Зарегистрирован: 21 ноя 2021, 18:45

Re: Перемещение камеры в место клика на миникарте

Сообщение alew 21 ноя 2021, 21:59

Ну вы же можете перенести центральную точку местоположения камеры на миникарту? Ну и останется достроить два(или четыре, как вам удобней) пропорциональных треугольника, исходя из размеров камеры.
alew
UNIт
 
Сообщения: 76
Зарегистрирован: 23 ноя 2018, 19:59

Re: Перемещение камеры в место клика на миникарте

Сообщение myxamor0 22 ноя 2021, 20:01

alew писал(а):Ну вы же можете перенести центральную точку местоположения камеры на миникарту? Ну и останется достроить два(или четыре, как вам удобней) пропорциональных треугольника, исходя из размеров камеры.

меня интересует именно как нарисовать. Допустим 4 точки вершин я найду. Как рисовать произвольный четырехугольник на поверхности RawImage?
myxamor0
UNец
 
Сообщения: 3
Зарегистрирован: 21 ноя 2021, 18:45


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6