Kuzevich

Kuzevich

Сегодня я расскажу Вам как в Unity3D сделать перетаскивание объектов в предназначенные для них места с помощью Drag&Drop и как сделать анимацию прыгающих значков. Не претендую на истину в последней инстанции с точки зрения "как надо", пишу о том, как я сделал рабочее решение, работающее не только с мышкой, но и на мобильных устройствах с тачскринами. Для начала создаем под Main Camera - Canvas (область отображения интерфейса) Внутри него создаем 4 картинки (UI->image)

Две картинки переименовываем в place1 и place2 и задаем им цвета потемнее (это будут места, куда мы сможем перетащить объекты) Другие две переименовываем в item1 и item2 и задаем им цвета посветлее (это будут перетаскиваемые элементы, которые мы должны положить на соответствующие места)

Добавляем для наших item'ов компоненты: Phisics 2D->RigidBody 2D и Phisics 2D->Box Collider 2D

 

А на объекты place1 и place2 добавляем только коллайдеры Не забудьте откорректировать размер коллайдеров под размер объекта и поставить у них галку Is Trigger

 

Создаем C# скрипт DragHandler.

Добавляем:

using UnityEngine.EventSystems; 
using UnityEngine.UI;

видим класс:

public class DragHandler : MonoBehaviour {

добавляем интерфейсы:

public class DragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler

Добавляем переменные:

public static GameObject itemBeingDragged; 
Vector3 HomePosition; 
Rigidbody2D rb; 
GameObject ObjectUnder; 
string ObjectUnderName="";

Реализуем интерфейсы:

#region IBeginDragHandler implementation
 
public void OnBeginDrag(PointerEventData eventData)
{
//Запоминаем перетаскиваемый объект и его начальную позицию
itemBeingDragged = gameObject;
ObjectUnderName = "";
 
}
 
#endregion
 
#region IDragHandler implementation
 
public void OnDrag(PointerEventData eventData)
{
//используем RigidBody для отлова пересечений (collider)
rb.MovePosition(eventData.position);
}
 
#endregion
 
#region IEndDragHandler implementation
 
public void OnEndDrag(PointerEventData eventData)
{
 
itemBeingDragged = null;
 
//проверяем на место ли перетащили
if (ObjectUnderName == "place1" && this.name == "item1")
{
transform.position = ObjectUnder.transform.position;
//тут можем что то еще делать
}
else if (ObjectUnderName == "place2" && this.name == "item2")
{
transform.position = ObjectUnder.transform.position;
//тут можем что то еще делать
}
else
{
//если нет пересечения возвращаем в исходное положение
transform.position = HomePosition;
}
 
}
 
#endregion

Добавляем обработку коллизий:

void OnTriggerEnter2D(Collider2D myCollision)
{
// определение столкновения с двумя разноименными объектами
ObjectUnder = myCollision.gameObject;
ObjectUnderName = ObjectUnder.name;
}
 
void OnTriggerExit2D(Collider2D myCollision)
{
// определение столкновения с двумя разноименными объектами
ObjectUnder = myCollision.gameObject;
ObjectUnderName = "";
}

Теперь добавляем наш скрипт к объектам item1 и item2

Проверяем, что все работает. Зеленый квадрат ложится только на зеленый, голубой на синий.

В принципе все, но добавим немного анимации для перетаскиваемых объектов (подпрыгивание)

Добавляем переменные:

//подпрыгивание объектов
Vector3 placePosition;
float DeltaPos;
float MyVector;

В процедуру Start() добавляем сохранение начальных значений:

//подпрыгивание объектов
placePosition = transform.position;
MyVector = 0.2f;
 

И анимируем прыжки в процедуре Update void Update()

void Update()
{
//подпрыгивание объектов
if (DeltaPos > 1) MyVector = -0.2f;
if (DeltaPos < -1) MyVector = 0.2f;
DeltaPos += MyVector;
 
if (itemBeingDragged == null && ObjectUnderName == "")
{
transform.position = placePosition + new Vector3(0.0f, DeltaPos, 0.0f); ;
}
}

Вот теперь все. Если вдруг непонятно описал, то можете скачать рабочий проект для unity3D отсюда.

Добрый день, друзья.

С Unity3D я уже работаю достаточно продолжительное время. Можно долго рассказывать про его плюсы, но этого и без меня на просторах достаточно. Основная фишка - это кроссплатформенность. С его помощью можно быстро и эффективно разрабатывать игровые приложения для различных платформ.
Имея опыт сборки проектов для Android и Windows я не ожидал столько всего интересного от сборки под устройства Apple.
А там полностью своя экосистема со своей логикой, и людям никогда до этого с этим не сталкивающимся, будет вначале сложно.
Вы не сможете просто собрать пакет и отправить его пользователю для установки. Все это делается с помощью сервисов. Раньше был отдельный сервис TestFlight, теперь, после покупки его компанией Apple, он встроен в itunesconnect.
Так же хочу отметить, что у Unity есть интересный сервис Unity Cloud Build с помощью которого можно не имея MacOS собрать пакет. Но у меня он выдавал кучу непонятных ошибок, поэтому я пошел стандартным путем разработчика под iOS.

Понадобились мне архивные справки получить для родственника работавшего на ГАЗе, поиск по интернету дает следующую информацию:

https://nnvburg.ru/addr/l/lenina_prospekt/88/upravlenie_arhivnoy_deyatelnosti_gk_gaz/

Проспект Ленина 88. По прибытии на место (управление ГАЗа) оказалось, что они про архив слышали, но где он не знают.

Пишу, для тех кто будет искать в интернете:

Адрес: проспект Ленина, 97Б

P.S. Справок о работе во Дворце Культуры ГАЗ при этом у них нет... будем искать...

P.S. Очень понравилась работа и отношение - все быстро и четко. Что очень удивило.

 

Столкнулся на прошлой неделе еще с одной неординарной проблемой: внезапно перестала работать синхронизация товаров и цен в программе 1С Управление Торговлей 11 с сайтом на Bitrix.

Как выяснилось, в 11 Торговле цены выгружаются исходя из соглашений.

Что нужно проверить в соглашениях:

1. Должно быть типовым (не индивидуальным) 
2. Должно быть действующим. т.е. статус соглашения должно быть "Действует" 
3. Должно быть с пустым сегментом партнеров, т.е. не заполнено поле "Сегмент партнеров" 
4. Должно быть доступно внешним пользователям, т.е. установлен флаг "Доступно внешним пользователям". 
4.1 Если флаг "Доступно внешним пользователям" не виден, то нужно включить использование внешних пользователей (в администрировании флаг "Разрешить доступ внешним пользователям") 


Затем в соглашении нужно указать вид цены, по которому мы хотим, чтобы выгружались цены. 

Убедиться, что по выбранному виду цены имеются цены заполненные на товары и/или характеристики. 

Это я все проверил - проблем не было.

Тогда я выгрузил данные в файл обмена и проанализировал его.

В файле offers0_1.xml обнаружил дублирующую строку ТипЦены (с одним id, но разными валютами)

 Разбираемся, откуда взялась цена в Евро.

С помощью консоли запросов выбираем регистраторы цен в евро из регистра сведений Цены Номенклатуры:

ВЫБРАТЬ
    ЦеныНоменклатуры.Цена КАК Цена,
    ЦеныНоменклатуры.Валюта КАК Валюта,
    ЦеныНоменклатуры.Регистратор КАК Регистратор,
    ЦеныНоменклатуры.ВидЦены КАК ВидЦены
ИЗ
    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
ГДЕ
    ЦеныНоменклатуры.ВидЦены = &ВидЦены
    И ЦеныНоменклатуры.Валюта = &Валюта
 
где в параметрах устанавливаем наш Вид Цены и Валюту EUR.
 
Получаем список документов и корректируем их (устанавливаем рублевую цену для нашего типа цены).
После корректировки документов, дубль Типа Цены больше не выгружался в файл и выгрузка на сайт снова заработала в штатном режиме.