Реализация космоса в 2D аркаде

Общие вопросы о Unity3D

Re: Реализация космоса в 2D аркаде

Сообщение waruiyume 02 мар 2012, 19:28

Не текстуры, а материала и то если только, выставлять через "renderer.material", а не через "renderer.sharedMaterial".
<<память не очищается>>- пруф?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Реализация космоса в 2D аркаде

Сообщение Friend123 02 мар 2012, 20:52

artk писал(а):Вам, лучше, не стоит использовать "прокрутку" текстуры. При изменении uv текстуры - создается ее копия, память не очищается.

А я сделал материал, на него текстуру, и прокручиваю через renderer.material.SetTextureOffset. Так будет нормально? К сожалению, другого способа не знаю
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Реализация космоса в 2D аркаде

Сообщение artk 02 мар 2012, 21:19

renderer.sharedMaterial

Спасибо, что-то пропустил. Под "не очищается память", я имел в виду, - остается копия материала в памяти и после удаления со сцены. Skydome, имхо, будет удобнее, если космос будет большим и с 3D элементами в фоне.
Аватара пользователя
artk
Старожил
 
Сообщения: 749
Зарегистрирован: 22 май 2011, 12:22

Re: Реализация космоса в 2D аркаде

Сообщение Friend123 02 мар 2012, 21:37

artk писал(а):Skydome, имхо, будет удобнее, если космос будет большим и с 3D элементами в фоне.

SkyDome может и удобнее, но не знаю, 3D элементов на фоне не будет, хочу сделать дальний слой-бэкграунд, там просто должна быть статичная картинка, прокручивающайся по ходу полета корабля, второй слой - чуть ближе - там уже можно делать звезды, кометы, космическую пыль, и третий слой - там где происходит всё действие - полет, бои, планеты и т.д.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Реализация космоса в 2D аркаде

Сообщение Friend123 04 мар 2012, 00:21

В общем, почти разобрался с технологией, с бэкграундом осталось сделать последнее - сделать скролл материала бэкграунда против движения корабля. Ну т.е. движется корабль по оси X+, фон скроллиться по X-. Я так понимаю, для этого мне нужно вычислить разницу между текущим положением объекта и старым положением в последнем кадре... или может проще есть какие-то методы?
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Реализация космоса в 2D аркаде

Сообщение Order 04 мар 2012, 03:32

Двигай корабль и двигай зеркально текстуру с коэффициентами.
Добавить rusorder в Skype , _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.
Скрытый текст:
_ttp://www.youtube.com/watch?v=1m2qTnatSjM&list=UUjcKNvONEUHCILG7QrX1NFg
Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Реализация космоса в 2D аркаде

Сообщение Friend123 04 мар 2012, 12:04

Order писал(а):Двигай корабль и двигай зеркально текстуру с коэффициентами.

Вот в этом и загвоздка, не могу продумать... как вычислить этот коэффициент
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Реализация космоса в 2D аркаде

Сообщение Friend123 06 мар 2012, 10:24

Потратил уже достаточно времени, постепенно пришел к другому решению - незачем скроллить текстуру, возможно и правда много памяти отъест программа, поэтому придумал более простое решение - двигать плоскость с бэкграундом вместе с игроком. Формула такова: координата плоскости = предыдущая позиция + скорость движения игрока + поправочный коэффициент. Получается немного горбато, она движется то быстро, то медленно, не в такт одним словом. Игрок двигается так:
Синтаксис:
Используется csharp
player.position += player.forward * speed * Time.deltaTime;
 


А плоскость так двигать не получится, только через задание координат Vector3. Вот код:
Синтаксис:
Используется csharp
void Update () {               
        pos = new Vector3(player.position.x, transform.position.y, player.position.z);
               
        // Дельта позиций игрока
        float dposX = pos.x - oldpos.x;
        float dposZ = pos.z - oldpos.z;
        // Получаем скорость игрока из другого скрипта
        float playerSpeed = player.GetComponent<PlayerControl>().speed;
               
        // Поправочный коэффициент               
        if(dposX > 0){ moveX = playerSpeed + (-0.0005f); }
        else if(dposX < 0){     moveX = playerSpeed * 0.0005f; }
        else{ moveX = 0; }
               
        if(dposZ > 0){ moveZ = playerSpeed + (-0.0005f); }
        else if(dposZ < 0){     moveZ = playerSpeed + 0.0005f; }
        else{ moveZ = 0; }
               
        transform.position = new Vector3(transform.position.x + moveX, transform.position.y, transform.position.z + moveZ);
               
        oldpos = new Vector3(player.position.x, transform.position.y, player.position.z);
               
}
 

Возможно, всё делается намного проще, чем делаю я...

UPDATE. Посидел, поковырялся и сделал то, что надо. Скорость игрока берем из дельты позиций - вот оказалось вовсе простое решение. Выкладываю код, может кому понадобится:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Background : MonoBehaviour {
       
        public Transform player;

        private float scrollSpeed = 0.03f;
        private Vector3 pos;
        private Vector3 oldpos;
        private float moveX;
        private float moveZ;
       
        // Use this for initialization
        void Start () {
                            // Условная позиция, может быть любая
                transform.position = new Vector3(player.position.x, transform.position.y, player.position.z);
                oldpos = new Vector3(0,0,0);
                moveX = 0;
                moveZ = 0;
        }
       
        // Update is called once per frame
        void Update () {               
                pos = new Vector3(player.position.x, transform.position.y, player.position.z);
               
                // Дельта позиций игрока
                float dposX = pos.x - oldpos.x;
                float dposZ = pos.z - oldpos.z;
               
                // Z- вниз, Z+ вверх, X- влево, X+ вправо (поправочные коэффициенты)        
                if(dposX > 0){ moveX = -scrollSpeed; }
                else if(dposX < 0){     moveX = scrollSpeed; }
                else{ moveX = 0; }
               
                if(dposZ > 0){ moveZ = -scrollSpeed; }
                else if(dposZ < 0){     moveZ = scrollSpeed; }
                else{ moveZ = 0; }
               
                // Двигаем задник по позиции игрока + поправочный коэффициент
                transform.position = new Vector3(transform.position.x + dposX + moveX, transform.position.y, transform.position.z + dposZ + moveZ);
               
                oldpos = new Vector3(player.position.x, transform.position.y, player.position.z);
        }              
}
 
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Реализация космоса в 2D аркаде

Сообщение artk 06 мар 2012, 18:32

Все же, знаете вы толк в извращениях...
Аватара пользователя
artk
Старожил
 
Сообщения: 749
Зарегистрирован: 22 май 2011, 12:22

Re: Реализация космоса в 2D аркаде

Сообщение Friend123 06 мар 2012, 18:51

artk писал(а):Все же, знаете вы толк в извращениях...

Возможно :) на данный момент - это лучшее из предложенных мной и остальными решений. Опыта будет побольше - пересмотрю структуру...
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Пред.

Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 15