Пятница, 29 Марта 2024, 18:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Записи участника » Gidly [13]
Результаты поиска
GidlyДата: Вторник, 28 Августа 2018, 19:55 | Сообщение # 1 | Тема: Баг миникарты
был не раз
Сейчас нет на сайте
Как вы все знаете, во многих играх есть миникарта, также она является неотъемлемой частью серии игр Grand Theft Auto начиная с 3 части. Я делаю свою игру в жанре "типа гташка". Но путь мне перегородил баг маркера миникарты. Сам маркер как-бы движется за игроком на определенном расстоянии, и таким образом он рисуется на границе миникарты, но когда ГГ начинает приближаться к маркеру он начинает быстро перемещаться то в свою начальную точку, то в заданное расстояние, тем самым дергаясь. Вот его скрипт:
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Marker : MonoBehaviour {

    [SerializeField] float SizeMultiplier;
    [SerializeField] float offset_y = 7.5f;
    [SerializeField] float MapDistance;
    [SerializeField] float MapRMultiplier;
    [SerializeField] Sprite S_norm;
    [SerializeField] Sprite S_Arrow;
    Vector3 StartPos;

    float x;
    float z;
    float r;
    float fi;
    float R;

    public Camera map_camera;
    public Transform target;
    public RenderTexture render_texture_rect;
    public Material minimap;
    public Sprite marker;

    void Start()
    {
        StartPos = this.transform.position;
    }

    void FixedUpdate ()
    {       
        R = render_texture_rect.width * map_camera.orthographicSize * MapRMultiplier;
        x = transform.position.x - target.position.x;
        z = transform.position.z - target.position.z;
        r = Mathf.Sqrt(Mathf.Pow(x, 2)+Mathf.Pow(z, 2));
        fi = Mathf.Atan2(z, x);
        if (r < R)
        {
            transform.position = StartPos;
            minimap.mainTexture = marker.texture;
        }else if (r >= R)
        {
            transform.position = new Vector3(R * MapDistance * Mathf.Cos(fi) + target.position.x, offset_y, R * MapDistance * Mathf.Sin(fi) + target.position.z);
            minimap.mainTexture = marker.texture;
        }
    }
}

Заранее спасибо!
GidlyДата: Суббота, 11 Августа 2018, 00:46 | Сообщение # 2 | Тема: Маркер на границе миникарты
был не раз
Сейчас нет на сайте
Я, будучи профаном в области Mathf и т.п. не очень понимал ответы, которые мне писали, кстати всем спасибо, вы поставили мне цель. И вот, с помощью своей криворукости и скорее всего единственного видео на youtube связанного с подобными маркерами, я накалял такую вот дичь
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Marker : MonoBehaviour {

    [SerializeField] float SizeMultiplier;
    [SerializeField] float offset_y = 7.5f;
    [SerializeField] float MapDistance;
    [SerializeField] float MapRMultiplier;
    [SerializeField] Sprite S_norm;
    [SerializeField] Sprite S_Arrow;
    Vector3 StartPos;

    float x;
    float z;
    float r;
    float fi;
    float R;

    public Camera map_camera;
    public Transform target;
    public RenderTexture render_texture_rect;
    public Material minimap;
    public Sprite marker;

    void Start()
    {
        StartPos = transform.position;
    }

    void FixedUpdate ()
    {       
        R = render_texture_rect.width * map_camera.orthographicSize * MapRMultiplier;
        x = transform.position.x - target.position.x;
        z = transform.position.z - target.position.z;
        r = Mathf.Sqrt(Mathf.Pow(x, 2)+Mathf.Pow(z, 2));
        fi = Mathf.Atan2(z, x);
        if (r < R)
        {
            Vector3 parentPos = transform.position;
            parentPos.y = offset_y;
            transform.position = StartPos;
            minimap.mainTexture = marker.texture;
        }else if (r >= R)
        {
            transform.position = new Vector3(R * MapDistance * Mathf.Cos(fi) + target.position.x, offset_y, R * MapDistance * Mathf.Sin(fi) + target.position.z);
            minimap.mainTexture = marker.texture;
        }
    }
}

Все вроде работает, когда маркер уходит за радиус карты, он не пропадает, но когда перс начинает к нему приближаться, а тот еще не в радиусе, маркер начинает дергаться, как это решить? Спасибо!


Сообщение отредактировал Gidly - Суббота, 11 Августа 2018, 13:10
GidlyДата: Среда, 08 Августа 2018, 10:38 | Сообщение # 3 | Тема: Сохранение игры
был не раз
Сейчас нет на сайте
Точняк! Спасибо! Написал вот так, он теперь и патроны сохраняет!
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class SaveData
{
    public int ammo;
    public int health;
    public Vector3 pos;
}

public class SaveSystem : MonoBehaviour
{
    public AK AK;
    public Pers_control pers;
    public Vector3 pos;

    void Start()
    {
        Load();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F6))
        {
            Save();
        }

        if (Input.GetKeyDown(KeyCode.F7))
        {
            Load();
        }
    }

    public void Save()
    {
        SaveData save = new SaveData();

        save.pos = transform.position;
        save.health = pers.health;
        save.ammo = AK.CurAmmo;

        string json = JsonUtility.ToJson(save);

        System.IO.File.WriteAllText("save.dat", json);
    }

    public void Load()
    {
        string json = System.IO.File.ReadAllText("save.dat");

        if (!string.IsNullOrEmpty(json))
        {
            var save = JsonUtility.FromJson<SaveData>(json);

            transform.position = save.pos;
            pers.health = save.health;
            AK.CurAmmo = save.ammo;
        }
    }
    void OnApplicationQuit()
    {
        Save();
    }
}
GidlyДата: Вторник, 07 Августа 2018, 23:24 | Сообщение # 4 | Тема: Сохранение игры
был не раз
Сейчас нет на сайте
Не сохраняется кол-во хп, хотя вроде по идее должно. Пишет ошибку, что мол ссылка на объект не указывает на экземпляр объекта, помогите пожалуйста, люди добрые!

Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class SaveData
{
   public Pers_control control;
    public int ammo;
    public int health;
    public Vector3 pos;
}

public class SaveSystem : MonoBehaviour
{
    public AK AK;
    public Pers_control pers;
    public int ammo;
    public int health;
    public Vector3 pos;

    void Start()
    {
        Load();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F6))
        {
            Save();
        }

        if (Input.GetKeyDown(KeyCode.F7))
        {
            Load();
        }
    }

    public void Save()
    {
        SaveData save = new SaveData();

        save.ammo = ammo;
        save.health = health;
        save.pos = transform.position;
        save.control.health = pers.health;

        string json = JsonUtility.ToJson(save);

        System.IO.File.WriteAllText("save.dat", json);
    }

    public void Load()
    {
        string json = System.IO.File.ReadAllText("save.dat");

        if (!string.IsNullOrEmpty(json))
        {
            var save = JsonUtility.FromJson<SaveData>(json);

            ammo = save.ammo;
            health = save.health;
            transform.position = save.pos;
            pers.health = save.control.health;
        }
    }
}


Сообщение отредактировал Gidly - Вторник, 07 Августа 2018, 23:24
GidlyДата: Воскресенье, 05 Августа 2018, 22:32 | Сообщение # 5 | Тема: Смена положения камеры
был не раз
Сейчас нет на сайте
Цитата Navarh ()
Gidly, Ты "else" не к тому "if" "цепляешь"

Да, большое спасибо, помогло!


Сообщение отредактировал Gidly - Воскресенье, 05 Августа 2018, 22:32
GidlyДата: Воскресенье, 05 Августа 2018, 11:47 | Сообщение # 6 | Тема: Смена положения камеры
был не раз
Сейчас нет на сайте
Я решил отказаться от этой идеи по причине более хорошей работы грамотной смены камеры. Но проблема опять в том, что мне нужно не GetMouseButton, а GetMouseButtonUp или GetMouseButtonDown, но при попытке это использовать всё опять дергается. Я понимаю, что тут нужна boolean переменная, но скрипт написан на JavaScript, а с ним я не дружу
Вот он:
Код
var camera1: Camera;
var camera2: Camera;

camera1.enabled = true;
camera2.enabled = false;

function Update() {
    if (Input.GetMouseButton(1)) {
        if (camera2.enabled == false)
            camera2.enabled = true;
            camera1.enabled = false;
    }
    else {
        camera2.enabled = false;
        camera1.enabled = true;
    }
}


Сообщение отредактировал Gidly - Воскресенье, 05 Августа 2018, 12:35
GidlyДата: Воскресенье, 05 Августа 2018, 00:26 | Сообщение # 7 | Тема: Смена положения камеры
был не раз
Сейчас нет на сайте
Цитата Minskii ()
Ну тогда просто сделай bool переменную. При нажатии, если она true, то пивот передвигается в точку Б а переменная становится false. Иначе пивот передвигается в точку А и переменная становится true. Первоначальные координаты можно сохранять в какие нибудь переменные пока bool = true.


Слушай, у меня почти получилось, я добавил необходимые строки, но если я один раз кликнул мышкой камера просто дергается-переходит в нужную позицию и тут же возвращается. Как это исправить?
Вот скрипт
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraAim : MonoBehaviour {

    public GameObject m_camera;
    public Vector3 newPos;
    public Vector3 startPos;
    bool newpos = true;

    void Update()
    {
        startPos = m_camera.transform.position;
        if (Input.GetKeyDown(KeyCode.Mouse1))
        {
            if (newpos == true)
            {
                m_camera.transform.position = new Vector3(transform.position.x + 0.583f, transform.position.y + 1.304f, transform.position.z + 0.46f); ;
                newpos = false;
            }
        }
       else
        {
            m_camera.transform.position = new Vector3(transform.position.x, transform.position.y + 1.304f, transform.position.z - 0.173f);
            newpos = true;
        }
    }
}


Сообщение отредактировал Gidly - Воскресенье, 05 Августа 2018, 00:26
GidlyДата: Суббота, 04 Августа 2018, 18:26 | Сообщение # 8 | Тема: Отрисовка маркера на границе миникарты
был не раз
Сейчас нет на сайте
Да это я понял, мне и на другом форуме писали про тангенс угла и клемп, но проблема в том, что я не знаю, как этим правильно пользоваться, я не знаю как это в коде применить, может пример набросайте кто-нибудь, буду благодарен

Добавлено (08 Августа 2018, 12:55)
---------------------------------------------
Ну ребята, объясните пожалуйста, нифига не понимаю, плиз, плиз! Ну друзья, скажите хотя-бы примерно как это выглядит.

GidlyДата: Суббота, 04 Августа 2018, 16:55 | Сообщение # 9 | Тема: Отрисовка маркера на границе миникарты
был не раз
Сейчас нет на сайте
У меня есть миникарта, представляет собой она рендер текстуру с обводкой. Вот её скрипт:
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MiniMapGUI : MonoBehaviour
{

    public RenderTexture MiniMapTexture;
    public Texture2D MiniMapHope;
    public Material MiniMapMat;
    public GameObject _cc;
    float offset = 10;
    float CamSize = 45f;

    void Update()
    {
        Vector3 pos = _cc.transform.position;
        gameObject.transform.position = new Vector3(pos.x, 40f, pos.z);
        gameObject.GetComponent<Camera>().orthographicSize = CamSize;
    }
    void OnGUI()
    {
        if (Event.current.type == EventType.Repaint)
        {
            Graphics.DrawTexture(new Rect(Screen.width * 0.0025f, Screen.height - 260, 256, 256), MiniMapTexture, MiniMapMat);
            Graphics.DrawTexture(new Rect(Screen.width * 0.0025f, Screen.height - 260, 256, 256), MiniMapHope);
        }
    }
}

Собственно такой вопрос: как отображать маркер миссии(например) на границе миникарты когда сам маркер вне поля зрения камеры?
GidlyДата: Пятница, 03 Августа 2018, 20:49 | Сообщение # 10 | Тема: Привязка GUI элемента к границам экрана(РЕШЕНО)
был не раз
Сейчас нет на сайте
Собственно вопрос такой: У меня имеется миникарта, которая является GUI элементом, как её привязать к границам экрана-адаптировать под разные разрешения. Вот метод OnGUI:
void OnGUI ()
{
if (Event.current.type == EventType.Repaint)
{
Graphics.DrawTexture(new Rect(Screen.width - 1560 - offset, offset, 256, 256), MiniMapTexture, MiniMapMat);
Graphics.DrawTexture (new Rect (Screen.width - 1560 - offset * 2, 0, 256 + offset * 2, 256 + offset * 2), MiniMapHope);
}
}
Не бейте, не знаю как тут код вставлять

Решил!! надо было убрать лишние слова и умножить на какое нибудь число Screen.width

Вот как это выглядит:

Graphics.DrawTexture(new Rect(Screen.width * 0.0025f, Screen.height - 260, 256, 256), MiniMapTexture, MiniMapMat);
Graphics.DrawTexture(new Rect(Screen.width * 0.0025f, Screen.height - 260, 256, 256), MiniMapHope);


Сообщение отредактировал Gidly - Суббота, 04 Августа 2018, 10:35
GidlyДата: Четверг, 02 Августа 2018, 09:54 | Сообщение # 11 | Тема: Смена положения камеры
был не раз
Сейчас нет на сайте
НУ смотри. У меня есть скрипт на то, чтобы персонаж бегал туда, куда смотрит камера. И также скрипт на прицеливание по всем осям, то есть перс может целиться вверх, вниз, и вправо-влево, куда смотрит камера. Дочерний объект камеры-пустышка, к которой собственно и стремится персонаж. Я пробовал искать варианты со сменой камеры, и также пробовал менять ту пустышку на ту, которая на 2-ой камере(Я камеру продублировал, просто позицию поменял). Перс стал неадекватно целиться вверх и смотреть на камеру. Я смотрел будучи в игровом режиме на сцену, и видел что показывала игру 2 камера, но при этом первая не выключилась. Я смотрел на статистику игрового режива, где в правом верхнем углу вкладка, рядом с Gizmos вроде, там fps и нагрузку на сис-му показано, при прицеливании все параметры резко подлетали из-зи того, что,повторюсь снимают 2 камеры. Пишите что не понятно
GidlyДата: Среда, 01 Августа 2018, 15:59 | Сообщение # 12 | Тема: Смена положения камеры
был не раз
Сейчас нет на сайте
Нет, так тоже не вариант, в стандартной камере 3 объекта, фри-лук камера риг со всякими скриптами, сам пивот и в нем камера. Смена камеры не вариант потому что у моей основной камеры есть объект TargetRotate к которому будет поворачиваться персонаж при повороте камеры, это не стандартный перс, а мой. Смена камеры у меня приводит к тому, что работают сразу 2 камеры, одна собственно с TargetRotate-ом, а другая на нужном месте. Это приводит к потере 20 фпс!
GidlyДата: Среда, 01 Августа 2018, 13:06 | Сообщение # 13 | Тема: Смена положения камеры
был не раз
Сейчас нет на сайте
Тема такая: У меня есть стандартная фри-лук камера, мне нужно, чтобы на пкм пивот(пустой ГеймОбджект, за которым следит камера) менял свою позицию, и соответственно когда нажали ЕЩЁ раз на пкм он возвращался в исходное положение. Саму камеру перемещать не вариант, она хоть на конец карты ее позицию поменяй ничего не изменится. Так вот, главное чтобы было не просто GetMouseButton, а GetMouseButtonUp или в крайнем случает GetMouseButtonDown. Спасибо!
Форум игроделов » Записи участника » Gidly [13]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг