Привет! Я Денис и я делаю игры на Unity. В этом блоге я делюсь своим опытом в геймдеве и не только.
Навигация в закрепе: https://t.me/spellsingergames/3
Написать в личку: @sinedsem
Post #195
758
SP @spellsingergames
Showing posts older than #196 · Back to latest
ysdk.payments.getCatalog()ysdk.payments.purchase()ysdk.payments.consumePurchase()ysdk.payments.getPurchases()getPurchases/consume?consume endpoint должен быть защищен. Чтобы злоумышленник не мог списать чужие покупки. Стискиваю зубы ещё сильнее, нахожу механизм проверки подлинности данных, добавляю подпись к моим consume запросам, матерюсь, потому что из-за JS-кода всё приходится делать на callback'ах. У Game Push это давно реализовано
NullReferenceException в момент генерации мира на основе шаблона. Но номера строки или id проблемного шаблона в логах не было, а метод довольно большой и теоретически проблемных мест несколько.[0,300),[301,600) ), так получилось, что на 300 глубине не было ни одного топлива. И поэтому, когда конкретный шаблон попал именно на 300 глубину, случилась ошибка.[CanBeNull] на методы, которые возвращают «любое доступное на конкретной глубине топливо» и исправил использующий их код, чтобы он это учитывал.
Layout Element работает и с Content Size FitterLayout Element предназначен для Horizontal/Vertical Layout Group, но оказалось (вполне логично, однако), что и с Content Size Fitter он работает.public class Lightening : MonoBehaviour
{
[SerializeField] private float interval;
[SerializeField] private float minRange;
[SerializeField] private float maxRange;
[SerializeField] private int minCount;
[SerializeField] private int maxCount;
[Inject] private PlayerPosition playerPosition;
private readonly Vector3Int[] cellsInRange;
public Lightening()
{
// делаем массив клеток в радиусе относительно нулевых координат. Мы будем прибавлять их к позиции игрока.
cellsInRange = GridUtils.GetBetweenRanges(Vector3.zero, minRange, maxRange).ToArray();
}
private IEnumerator Start()
{
while (isActiveAndEnabled)
{
yield return new WaitForSeconds(interval); // задержка между выстрелами
var start = 0; // левая граница массива
var hit = 0;
var toHit = Random.Range(minCount, maxCount);
while (start < cellsInRange.Length && hit < toHit)
{
// выбираем рандомный элемент в массиве, начиная с левой границы
var randomIndex = Random.Range(start, cellsInRange.Length);
// меняем его местами с первым элементом
var cell = cellsInRange[randomIndex];
cellsInRange[randomIndex] = cellsInRange[start];
cellsInRange[start] = cell;
// сдвигаем левую границу на 1
start++;
var targetCell = playerPosition + cell; // получаем абсолютную позицию клетки
if (CanHit(targetCell)) // если она подходит
{
Hit(targetCell); // стреляем по ней
hit++;
}
}
}
}
private void Hit(Vector3Int cell)
{
...
}
private bool CanHit(Vector3Int cell)
{
...
}
}
GetBetweenRanges скину в комменты, там просто перебор всех клеток.Vector3Int), по которым может ударить молния. За один залп стреляем N молний. Клетки выбираются случайным образом в пределах минимального и максимального расстояния от игрока. По пустым клеткам нельзя стрелять. Если подходящих клеток меньше чем нужно или вообще нет, стреляем сколько сможем.Vector3Int playerPosition = ...; // позиция игорка
bool CanHit(Vector3Int cell) { ... } // проверяет, можно ли выстрелить в клетку
void Hit(Vector3Int cell) { ... } // стреляет в клетку
Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables/AddressablesInspectors.cs(19,29): error CS0234: The type or namespace name 'Editor' does not exist in the namespace 'Sirenix.OdinInspector' (are you missing an assembly reference?)
AddressablesInspectors.cs активно использует Editor код
using Sirenix.Utilities.Editor;
Sirenix.OdinInspector.Modules.Unity.Addressables, у которой стоит Platform = Any Platform. Any Platform, поставил только Editor, билд прошёл. 
[field: SerializeField] public Drill Prefab { get; private set; }
[PreviewField, ShowInInspector, ReadOnly, HideLabel]
private GameObject PrefabPreview => (Prefab as Component)?.gameObject;
Scriptable Object, который описывает скин. У него есть непосредственно prefab, который надевается на игрока, и Sprite, который показывается в магазине. Чтобы было удобнее с ними работать, я добавил в инспектор превью спрайта и превью префаба.IDE, но активно использую бесплатный ChatGPT. С 3-4 попыток он мне сгенерировал код инспектора, который показывает превьюхи.Improve standard editor view for my SO so I will see ShopSprite preview and Prefab preview below standard inspector. Drill is MonoBehaviour. Allow multi-editing, in that case, just don't draw previews. Handle Sprite transparency and fill back with solid gray color like unity inspector back. Draw the entire sprite texture, centered and scaled without stretching.
public abstract class DrillSkin : ScriptableObject
{
[field: SerializeField] public Sprite ShopSprite { get; private set; }
[field: SerializeField] public Drill Prefab { get; private set; }
}


gp.storage.set('save', savedData);gp.storage.set('backup', savedData);RectTransform в локальных координатах другого RectTransform. Creates a Bounds object that encapsulates all the child RectTransform objects found in the child parameter, and converts the resulting bounds into local space relative to the root transform.
ScrollView (отслеживаю положение ячейки внутри ScrollView, если граница ячейки уезжает за край, выключаю соответствующие стрелочки). Сами стрелочки при этом находятся поверх ScrollView.Canvas с Scale Mode = Expand. Увеличили Reference Resolution до 1500х2950 и почти всё поместилось. Вроде бы, получилось не мелко, похоже, изначально мы делали всё излишне крупно.
Failure to initialize! Your hardware does not support this application Failed to load 'libmain.so' java.lang. UnsatisfiedL inkError: dlopen failed: library "libmain.so not found
Дело в том, что эта ошибка возникает, если в APK отсутствует библиотека, соответствующая архитектуре устройства.
Пользователь связался с нами по электронной почте, и мы провели ряд экспериментов. У него на устройстве установился и запускается без проблем мультиплатформенный APK, а так же у него установилась и запустилась игра из Google Play, куда я загрузил аналогичным образом aab билд.
Поэтому я подозреваю, что проблема может быть именно с тем APK, который загружается из RuStore.
Добрый день, могу с уверенностью заявить, что проблема у пользователя возникает из-за RuStore.
Я попросил пользователя воспользоваться приложением App APK Extractor & Analyzer https://play.google.com/store/apps/details?id=com.ytheekshana.apkextractor для того, чтобы извлечь содержимое игры с его телефона и отправить мне.
Вот файл, который у него получился: https://drive.google.com/file/<...>
Он весит 48,5 МБ. Если я на своем устройстве делаю то же самое, у меня получается файл весом 66,0 МБ.
Вы мне ранее присылали два файла: base-master.apk (48,5 МБ) и base-arm64_v8a.apk (17,7 МБ). Очевидно, что при установке приложения пользователь не получает данные из файла base-arm64_v8a.apk - в том числе в этом файле находится папка libs с библиотеками, в том числе с той, которая упоминается в ошибке. Если открыть APK от пользователя как zip-архив, в нем действительно отсутствует папка libs, а в APK с моего устройства такая папка есть.
Ещё одним аргументом в пользу того, что проблема в RuStore, является то, что у пользователя игра без проблем устанавливается и запускается из Google Play.


Здравствуйте
Я может чтото пропустил, но у меня турбины убрали
Что за фигня??? Купил второй уровень ускорителей, чтобы забуриваться, а у меня даже первый не работает, на кой хрен я только ресурсы просрал и не плохие🤬😡🤬😡🤬😡🤬
Сбросились настройки. Причем собранные камни остались, а турбо вначале нет. Теперь придется проходить заново по тык-тыку? Я итак устал ждать когда там до редкого доберусь. Слишком долго развивается сюжет. Бросил играть..