Unity

Установка
 Установить Unity Hub
 Переназначить папку хранения Unity x.x.x в  Unity Hub
 Найти в архиве Unity 2019.3.12
 Автоматическая установка IDE Microsoft Visual Studio x Community


Создание Приложения для платформ
1. PC
2. Android

package com.bo52.off;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final Button toogle = (Button)findViewById(R.id.toogle);

toogle.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
Button button = (Button)findViewById(R.id.toogle);
button.setText("primer");
}
});

}
}

https://startandroid.ru/ru/uroki/vse-uroki-spiskom/190-urok-116-povedenie-activity-v-task-intent-flagi-launchmode-affinity.html


FLAG_ACTIVITY_NEW_TASK <br>
Activity находит свой таск, но не ищет в этом таске себя, а просто создает новое Activity сверху

https://habr.com/ru/company/pixonic/blog/353444/ <br>
https://legkovopros.ru/questions/38994/android-unity-zagruzka-fajla-v-fonovom-potoke  <br>
https://forum.unity.com/threads/running-audio-in-background.244847/ <br>
https://gist.github.com/Jerdak/8606110

РЕШЕНИЕ{Поместить task-код в метод Update класса MonoBehaviour }
http://blog.bodurov.com/Background-Worker-for-Unity3D/

Создание общего класса для работы в фоне и MonoBehaviour для использования на сцене{
BackgroundWorker.cs{
using System.Threading;
namespace com.youvisio{
public delegate void DoWorkEventHandler(object sender, DoWorkEventArgs e);
public delegate void RunWorkerCompletedEventHandler(object sender, RunWorkerCompletedEventArgs e);

public class BackgroundWorker{
public event DoWorkEventHandler DoWork;
public event RunWorkerCompletedEventHandler RunWorkerCompleted;
private Thread _thread;
private DoWorkEventArgs _doWorkArgs;
private bool _isCanceled;
public bool IsBusy{get { return _thread != null; }}
public void RunWorkerAsync(){RunWorkerAsync(null);}
public void RunWorkerAsync(object argument){if (_thread != null){throw new System.InvalidOperationException("Background Worker is already running");}
_isCanceled = false;
_thread = new Thread(OnBackgroundWork);
_thread.Name = "tBgW"+_thread.ManagedThreadId;
_thread.IsBackground = true;
_thread.Start(argument);
}
public void CancelAsync(){
if (_thread == null){return;}

_isCanceled = true;
}

public void Update(){
if (_thread != null && _doWorkArgs != null){
if (RunWorkerCompleted != null){
RunWorkerCompleted(this, new RunWorkerCompletedEventArgs(_doWorkArgs.Result, _doWorkArgs.Error, _doWorkArgs.IsCanceled));
}
_thread = null;
_doWorkArgs = null;
_isCanceled = false;
}
}
private void OnBackgroundWork(object arg){
if (DoWork != null){
var args = new DoWorkEventArgs(arg, () => _isCanceled);

if (!_isCanceled){
try{DoWork(this, args);}
catch (System.Exception ex){args.Error = ex;}
}
_doWorkArgs = args;
}
}
}

public class DoWorkEventArgs : System.EventArgs{private System.Func#r#bool> _canceled;
public DoWorkEventArgs(object argument, System.Func<bool> canceled){Argument = argument;
_canceled = (canceled == null) ? () => false : canceled;
}
public bool IsCanceled { get { return _canceled(); } }
public object Argument { get; private set; }
public object Result { get; set; }
public System.Exception Error { get; set; }
}

public class RunWorkerCompletedEventArgs :System.EventArgs{
public RunWorkerCompletedEventArgs(object result, System.Exception error, bool canceled){
Result = result;
Error = error;
IsCanceled = canceled;
}
public bool IsCanceled { get; private set; }
public object Result { get; private set; }
public System.Exception Error { get; private set; }
}
}
}
NewBehaviourScript.cs{
using UnityEngine;
using com.youvisio;
using UnityEngine.UI;
using System.Threading;

public class NewBehaviourScript : MonoBehaviour{
private BackgroundWorker _backgroundWorker;
public Text txBT;
// Start is called before the first frame update
void Start(){HandleTouch();}
void OnApplicationPause(bool pauseStatus){
//if (pauseStatus)
//HandleTouch();
}
// Update is called once per frame
void Update(){
if (_backgroundWorker != null)
_backgroundWorker.Update();
}
private void HandleTouch(){
if (_backgroundWorker != null) return;
//_backgroundWorker.CancelAsync();

_backgroundWorker = new BackgroundWorker();
_backgroundWorker.DoWork += (o, a) =>{
// executed on background thread
// do slow running computationaly intense work, check periodically

//if (a.IsCanceled) return;
var i = 0;
while(i<10){
Thread.Sleep(500);
i++;
}
//Thread.Sleep(5000);
// assign result as
//a.Result = a.Argument+"!";
a.Result = i + "!";
};
_backgroundWorker.RunWorkerCompleted += (o, a) =>{
//выполняется в главном потоке
txBT.text = (string)a.Result;
};
_backgroundWorker.RunWorkerAsync("A");
}
}
}
}
Перенос tcp в фон для теста с сервером{
}

Подкатегории

  1. класс создаётся в виде скрипта
  2. все классы хранятся в файле формата cs от С#
  3. имя класса соотвествует имени файла, в котором находится сам класс
  4. по умолчанию пустой класс C#  наследует класс MonoBehaviour от Unity
  5. класс может иметь свои или наследуемые методы
  6. класс может объявляться с присваиванием значений по умолчанию для полей
  7. класс может привязывается к игровому объекту сцены unity если наследует класс MonoBehaviour 

Без вызова Экземпляра
 Класс
  статическая get,set статического класса
  статическая функция статического класса
  статическая метод-функция класса
Класс предка MonoBehaviour
  статическая get,set класса предка MonoBehaviour
  статическая метод-функция класса предка MonoBehaviour

Вызвать Экземпляр
 Класс
  get,set класса
  метод-функция класса
 Класс предка MonoBehaviour
  get,set  класса предка MonoBehaviour
  метод-функция  класса предка MonoBehaviour

Функция
 объявление локальной переменной внутри функции неявно или типизированным способом
Класс
 объявление поля только типизированным способом

ключевые слова в C#

применяется для определения или разрешения использования типов как пространств имен

Модуль - сборка 

  1. настройка среды разработки для С# или JavaScript для скрипта
    Edit\Preferences..\External Tools\External Script Editor="Visual Studio 2017 (Comminity)"
  2. редактор сцены или уровня
    File\Open Scene... -> Assets\Scenes\SampleScene.unity
  3. настройка свойств объекта в инспекторе
  4. управление объектами в виде иерархического дерева
  1. создание проекта
    UnityHub\Projects\Add\{Version}{3D}{ProjectName}{Location}\Create->открывается Редактор
  2. сохранение проекта
    в Редакторе -> File\Save Project
  3. открыть проект
    UnityHub\Projects\->выбрать проект
  • открыть Проект
  • первая созданная сцена Unity
    File\Open Scene... -> Assets\Scenes\SampleScene.unity
  • создать новую сцену
    File\New Scene... -> Assets\Scenes\...\New.unity
  • сохранить текущую сцену
    File\Save
    File\Save As... -> Assets\Scenes\...\New.unity
  • GameObject
  • Базовый класс для всех объектов на сценах Unity
    создание пустого игрового объекта на сцене Unity
    открыть Сцену->Tab Hierarchy -> RBM (Right Button Mouse)-> Create Empty

Инспектор

Компоненты

  • гайки и болты Игровых Объектов и поведения в игре
  • Они являются функциональными частями каждого Игрового Объекта
    Фундаментальный объект в сценах Unity, который может представлять персонажей, реквизиты, пейзажи, камеры, путевые точки и многое другое
  1. открыть проект
  2. настройка среды разработки для С# или JavaScript в Редакторе для скриптов
    Edit\Preferences..\External Tools\External Script Editor="Visual Studio 2017 (Comminity)"
  3. создание пустого скрипта С#
    в Редакторе Tab Project->директория->RBM (Right Button Mouse)->create\C# Script ->Имя.cs (имя соотвествует имени класса в самом файле)

Все основные элементы языка C# для создания скриптов на Unity

для шейдера
от Unity
описательный язык программирования шейдера
cодержит в себе шейдерный код CG
обеспечивает взаимодействие с инспектором и материалом
включает в себя встроенные переменные и функции, облегчающие процесс написания шейдера
описывает свойства шейдера
содержит множество решений для различного графического оборудования

Каналы youtube

{

TheGameDev

{

Shader Forge часть 1

{

тесселяция dx11

}

Shader Forge часть 2

{

Custom Lighting

{

закручивание

ломка текстуры при помощи каналов цвета

плавная периодичность ломки текстуры

накладывание двух текстур

встроенная анимация

}

Lit (Basic)

{

тесселяция

}

Post Effect для камеры

{

тип шейдера

красивая загрузка

Game over

}

Shader Forge часть 3

{

ZWrite

глубина отрисовки объекта за стеной

}

}

}