SAD Games Studio😈
5 subscribers
99 photos
1 video
5 files
31 links
Телеграмм канал програмиста на юнити
Download Telegram
using System.IO; 
using UnityEngine;

namespace SaveServices
{
public class JsonSaveServices<T> : ISaveServices<T>
{
private string SavePath => Path.Combine(Application.dataPath, FullName);

private readonly string FullName;

public JsonSaveServices(string fileName) => FullName = fileName;

public T Load(object defaultSaveFile)
{
T walletData;

if (!File.Exists(SavePath))
{
Debug.Log("Error");

walletData = (T) defaultSaveFile;
}
else
{
string json = File.ReadAllText(SavePath);

walletData = JsonUtility.FromJson<T>(json);
}

return walletData;
}

public void Save(object saveFile)
{
string json = JsonUtility.ToJson(saveFile, true);
File.WriteAllText(SavePath, json);
}
}
}
JsonSaveServices - наследник IsaveServices. Его цель загружать и сохранять данные в Json файл.
public enum TaskType    {
NewScene, ReloadSecne,
}}
TaskType - перечисление двух типов заданий.
public class SceneManager    {
public SceneManager(TaskType type, string name) {
if (type == TaskType.NewScene) UnityEngine.SceneManagement.SceneManager.LoadScene(name);
else if (type == TaskType.ReloadSecne) UnityEngine.SceneManagement.SceneManager.LoadScene(UnityEngine.SceneManagement.SceneManager.GetActiveScene().buildIndex);
}
public SceneManager(TaskType type) {
if (type == TaskType.ReloadSecne) UnityEngine.SceneManagement.SceneManager.LoadScene(UnityEngine.SceneManagement.
SceneManager.GetActiveScene().buildIndex); }
}}
SceneManager - скрипт, с помощью TaskType который решает на какую сцены перейти или не перейти после оканчания всех заданий.
using Data; 
using Factory;
using SaveServices;
using Tasks;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using Wallet;
using Zenject;

namespace Installers
{
public class GameplayInstaller : MonoInstaller
{
private const string WalletFileSaveName = "walletData";

[SerializeField] private Button _taskExecuteButton;
[SerializeField] private TasksConfig _taskConfig;
[SerializeField] private RectTransform _canvas;
[SerializeField] private TaskSpawner _taskSpawner;
[SerializeField] private TextMeshProUGUI _text;
[SerializeField] private WalletView _walletView;

public override void InstallBindings()
{
BindTasks();
}

private void BindTasks()
{
Container.Bind<ITaskExecuter>().To<ButtonTaskExecuter>().AsSingle().WithArguments(_taskExecuteButton);
Container.Bind<TasksConfig>().FromInstance(_taskConfig).AsSingle();
Container.Bind<ISpawnerFactory>().To<SpawnerFactory>().AsSingle().WithArguments(_canvas);
Container.Bind<TaskSpawner>().FromInstance(_taskSpawner).AsSingle().NonLazy();
Container.Bind<ISaveServices<WalletData>>().To<JsonSaveServices<WalletData>>().AsSingle().WithArguments(WalletFileSaveName);
Container.Bind<Wallet.Wallet>().AsSingle();
Container.Bind<WalletView>().FromInstance(_walletView).AsSingle();

Container.BindInterfacesAndSelfTo<TaskManager>().AsSingle().NonLazy();
}
}
}
GameplayInstaller теперь больше инициализует.
using System; 
using System.Collections.Generic;
using UnityEngine;

namespace Tasks
{
public class TaskManager : IDisposable
{
private TasksConfig _tasksConfig;
private ITaskExecuter _taskExecuter;
private Task _currentTask;
private TaskSpawner _spawner;
private Wallet.Wallet _wallet;

private List<Task> _tasks;

public TaskManager(TasksConfig tasksConfig, ITaskExecuter taskExecuter, TaskSpawner spawner, Wallet.Wallet wallet)
{
_tasksConfig = tasksConfig;
_taskExecuter = taskExecuter;
_tasks = new List<Task>();
_spawner = spawner;
_wallet = wallet;

for (int i = 0; i < _tasksConfig.Tasks.Count; i++)
_tasks.Add(_tasksConfig.Tasks[i]);

_currentTask = _tasks[0];
_taskExecuter.Executed += NextTask;
}

private void NextTask()
{
_wallet.AddValue(_currentTask.AmountMoney);
_tasks.Remove(_currentTask);
_spawner.DestroyTask();

if (_tasks.Count >= 1)
{
Debug.Log(_currentTask.TaskName);

_currentTask = _tasks[0];
}
else if (_tasks.Count == 0)
{
Debug.Log(_currentTask.TaskName);

SceneManager.SceneManager sceneManager =
new SceneManager.SceneManager(_tasksConfig.TaskType, _tasksConfig.NameSceneToWin);
}
}

public void Dispose()
{
_taskExecuter.Executed -= NextTask;
}
}
}
Теперь после конца заданий он загружает сцену.
using System; 
using System.Collections.Generic;
using Tasks.SceneManager;
using UnityEngine;

[CreateAssetMenu(fileName = "TaskConfig", menuName = "Game/new TaskConfig")]
public class TasksConfig : ScriptableObject
{
[field: SerializeField] private List<Task>_tasks;
[SerializeField] private TaskType _taskType;
[SerializeField] private string _nameSceneToWin;

public List<Task> Tasks => _tasks;

public TaskType TaskType => _taskType;
public string NameSceneToWin => _nameSceneToWin;
}

[Serializable]
public struct Task
{
public Sprite Background;
public string TaskName;
public int AmountMoney;
}
TaskConfig и Task теперь хранят : Количество денег за выполнение задания, Тип задания, Сцену, на которую перейдет игрок после окончания заданий, если тип будет new Scene.
Вух это все.Потом буду делать новую фичу.Присылайте идеи.Если что-то не понятно, я могу объяснить.
Первая лекция

Начнём со сладенького: как зарабатывать на творческих играх. Рассказал в ней про перспективный для новичков рынок который позволяет зарабатывать даже с первого проекта. Приятного просмотра!

Смотреть - https://www.youtube.com/watch?v=jOUUHSbB6Jo

Дальше вас ждёт лекия про нарратив - как писать захватывающие сюжеты и передавать свои мысли игрокам.
Вторая лекция

Эксперт в создании сценариев и нарративов Александр Антюшин расскажет, как создать цепляющего персонажа и сделать диалоги, от которых не оторваться

Смотреть - https://www.youtube.com/watch?v=u9UmlGyLo6Q

Следующая лекцию будет про искуственный интелект, как применять нейросети чтобы быстрей достигать результата.
Третья лекция

Анжела Самородских поделится, как с помощью нейросетей быстро сгенерировать графику: локации, персонажей и противников

Смотреть - https://youtube.com/live/MfOYFqQS1pk?feature=share

В следующей лекции познакомим вас с движком Unity
Четвёртая лекция

Профессиональный разработчик Станислав Журавлёв шаг за шагом покажет, как сделать готовую визуальную новеллу в современном движке, на котором создаются ААА игры

Смотреть - https://youtube.com/live/TVSh1r-eOks?feature=share

Дальше вас ждёт финал - монетизация. Как зарабатывать с игры как можно больше.
Роман_Сакутин_C#_для_начинающих_на_практике.pdf
4.3 MB
Вышла моя книга

Спасибо что дождались, получилось 375 страниц где я раскрываю основы языка через практические задачи.

Своей целью я ставил не написать справочник по языку а показать как правильно программировать, передать идеи и смыслы которые в меня вкладывали мои наставники.

Книгу выкладываю бесплатно и без какой-либо рекламы внутри.

Лучшая благодарность - это помощь в её распространение.

Всех обнял.
Как я понял, что у вас последний экзамен будет 10 июня, то я решил составить начальный план разработки:

6 июня заканчиваются мои экзамены, значит я начну готовить и готовиться к началу разработки 13 июня. Если не ошибаюсь, то у Даниила тоже 6 июня всë заканчивается, поэтому тоже его жду к 13 июня в боевой готовности.

Всех остальных жду к 17 июня, тогда мы и начнём масштабно работать.

ХОЧУ НАПОМНИТЬ, ЧТО ПОСЛЕ ЭКЗАМЕНОВ НАДО НАЧАТЬ ИЗУЧАТЬ И ГОТОВИТСЯ К РАЗРАБОТКЕ СРАЗУ. Ну или, если вы сейчас решите как-то поменять, то ладно, но, если нет, то будет всё, как я сказал.

В промежутке с 13 июня до 17 июня я с Данилом анализируем рынок и готовим всё идеи в специальные файлы соответственно.

Желаю всём удачи в изучении.