|
22.07.2016, 23:22
|
#1
|
Нуждающийся
Регистрация: 29.06.2016
Сообщений: 80
Написано 28 полезных сообщений (для 52 пользователей)
|
Mistshift Обучение
Вот набросал для RTS как всё выглядеть должно.
Unity скачал.
Создал сферу.
А как туман вокруг неё сделать? Чтобы он собирался харвестером.
|
(Offline)
|
|
23.07.2016, 01:20
|
#2
|
Нуждающийся
Регистрация: 29.06.2016
Сообщений: 80
Написано 28 полезных сообщений (для 52 пользователей)
|
Ответ: Mistshift Обучение
На юнити не работает математика, а почему я не понимаю…
Вот GofL cамый живучий вариант.
Blitz3D
Graphics 640,480,16,2
Const UPS=60
Global x_grid
Global y_grid
x_grid=77
y_grid=77
Dim g1%(x_grid,y_grid)
Dim g2%(x_grid,y_grid)
Dim cube(x_grid,y_grid)
period=1000/UPS
time=MilliSecs()-period
For x=0 To x_grid
For y=0 To y_grid
g1%(x,y)=Rand(0,1)
Next
Next
Repeat
Repeat
elapsed=MilliSecs()-time
Until elapsed
ticks=elapsed/period
tween#=Float(elapsed Mod period)/Float(period)
For k=1 To ticks
time=time+period
If KeyHit(1) End
gen()
Next
Flip
Cls
Forever
Function gen()
For x=1 To x_grid-1
For y=1 To y_grid-1
c=0
For x1=-1 To 1
For y1=-1 To 1
If (x1)<>0 Or (y1)<>0
c=c+g1%((x1)+x,(y1)+y)
EndIf
Next
Next
If c<2 Or c>3 Then c=0
If c=2 Then c=g1%(x,y)
If c>2 Then c=1
g2%(x,y)=c
If g1%(x,y)=1
Plot x*2,y*2
EndIf
g1%(x-1,y-1)=g2%(x-1,y-1)
Next
Next
End Function
Порт ~ Unity
using UnityEngine;
using System.Collections;
public class LG : MonoBehaviour {
public int[,] g1 = new int[77,77];
public int[,] g2 = new int[77,77];
public GameObject[,] cube = new GameObject[77,77];
public int x_grid=77;
public int y_grid=77;
private int c=0;
void Start () {
for (int x = 0; x < x_grid; x++) {
for (int y = 0; y < y_grid; y++) {
cube[x,y] = GameObject.CreatePrimitive (PrimitiveType.Cube);
cube[x,y].transform.position = new Vector3 (x * 2, 0, y * 2);
cube[x,y].transform.localScale = new Vector3 (2, 2, 2);
cube[x,y].renderer.material.color = new Color(x *0.1f,0,y *0.1f);
g1[x,y]=Random.Range(0, 1);
}
}
}
void Update () {
//gen()
for (int x =1; x < x_grid-1; x++) {
for (int y = 1; y < y_grid-1; y++) {
c=0;
for (int x1 = -1; x1 < 1; x1++) {
for (int y1 = -1; y1 < 1; y1++) {
if (x1<0 || x1>0 || y1<0 || y1>0){c+=g1[x+x1,y+y1];}
}
}
if (c<2 || c>3){c=0;}
if (c>=2){c=g1[x,y];}
if (c>2) {c=1;}
g2[x,y]=c;
if (g1[x,y]>=1) {
cube[x,y].active= true;
}
else{
cube[x,y].active= false;
}
g1[x-1,y-1]=g2[x-1,y-1];
}
}
//gen()
}
}
Трансляция: https://www.twitch.tv/foxymist
|
(Offline)
|
|
23.07.2016, 02:43
|
#3
|
Нуждающийся
Регистрация: 29.06.2016
Сообщений: 80
Написано 28 полезных сообщений (для 52 пользователей)
|
Ответ: Mistshift Обучение
Всё, на сегодня я закончил, 1:0 в пользу Unity(Первый день разработки прошел удачно). Всё против меня, обс тормозит, лг не считает, Unity3D.
Надо поспать и начать сначала. Да новых встреч.
С вами был Foxymist - программист, мой член стал больше на целый миллиметр.
|
(Offline)
|
|
23.07.2016, 13:51
|
#4
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Mistshift Обучение
На юнити не работает математика
|
Вряд ли кто-то будет ползать с лупой по чужому коду, выискивая, что же не так.
Выводи по очереди в лог (DebugLog на Блице и Debug.Log на Юнити) все значения, которые ты вычисляешь и обнаружишь в каком месте ошибка.
Кстати вместо этого:
public int[,] g1 = new int[77,77];
public int[,] g2 = new int[77,77];
public GameObject[,] cube = new GameObject[77,77];
Можно и нужно применять ООП, потому что в таком виде код будет разобрать сложно, отсюда и ошибки.
Но в целом здорово что ты сам разобрался как портировать.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.07.2016, 16:06
|
#5
|
Нуждающийся
Регистрация: 29.06.2016
Сообщений: 80
Написано 28 полезных сообщений (для 52 пользователей)
|
Ответ: Mistshift Обучение
Сообщение от ABTOMAT
Вряд ли кто-то будет ползать с лупой по чужому коду, выискивая, что же не так.
Выводи по очереди в лог (DebugLog на Блице и Debug.Log на Юнити) все значения, которые ты вычисляешь и обнаружишь в каком месте ошибка.
Кстати вместо этого:
public int[,] g1 = new int[77,77];
public int[,] g2 = new int[77,77];
public GameObject[,] cube = new GameObject[77,77];
Можно и нужно применять ООП, потому что в таком виде код будет разобрать сложно, отсюда и ошибки.
Но в целом здорово что ты сам разобрался как портировать.
|
Если честно я не разобрался, да “портировал” но в c# я не шарю.
Например; я не понимаю, почему в Blitz я могу писать так If (x1)<>0 Or (y1)<>0 а в юнити нет, ну
то есть операторы “<>” я использовать не могу чтоли? Или в юнити например if (c>=2)
почему “c>=2” а не “с=2” мне не надо “>” мне надо “=” но с равно выдаёт ошибку сам юнити.
А так, я нарочно упростил алгоритм, чтобы проще было портировать.
ООП? не понимаю о чём ты хочешь мне сказать, почитал за ООП в вики;
Объе́ктно-ориенти́рованное программи́рование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования
|
Если можно, поясни пожалуйста, так как у меня всего два объекта Сфера и Куб.
Пошел второй день обучения.
|
(Offline)
|
|
23.07.2016, 16:17
|
#6
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Mistshift Обучение
Сообщение от Foxymist
почему в Blitz я могу писать так If (x1)<>0 Or (y1)<>0 а в юнити нет
|
Потому что Блитз древний. Сейчас во всех языках надо так:
x1 значение может быть любым, но должно быть не равно 0 что-бы условие сработало.
Сообщение от Foxymist
Или в юнити например if (c>=2)
почему “c>=2” а не “с=2” мне не надо “>” мне надо “=” но с равно выдаёт ошибку сам юнити.
|
Для проверки на равенство надо
В современных языках " =" это значить присвоить значение, а " ==" сравнить значения.
Выражение " >=" или " <=" в Юнити работает так же как и в Блитзе.
Сообщение от Foxymist
ООП? не понимаю о чём ты хочешь мне сказать
|
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.07.2016, 17:09
|
#7
|
Нуждающийся
Регистрация: 29.06.2016
Сообщений: 80
Написано 28 полезных сообщений (для 52 пользователей)
|
Ответ: Mistshift Обучение
Сообщение от Nex
Потому что Блитз древний. Сейчас во всех языках надо так:
x1 значение может быть любым, но должно быть не равно 0 что-бы условие сработало.
Для проверки на равенство надо
В современных языках " =" это значить присвоить значение, а " ==" сравнить значения.
Выражение " >=" или " <=" в Юнити работает так же как и в Блитзе.
|
Полиморфизм - это то, что мне понадобиться, да и в целом полезный урок спасибо.
Получается все эти массивы (которые я нагороди, не нужны) мне и одного массива будет достаточно.
|
(Offline)
|
|
24.07.2016, 01:24
|
#8
|
Нуждающийся
Регистрация: 29.06.2016
Сообщений: 80
Написано 28 полезных сообщений (для 52 пользователей)
|
Ответ: Mistshift Обучение
Вот так работает;
using UnityEngine;
using System.Collections;
public class LG : MonoBehaviour {
public int x_grid = 77;
public int y_grid = 77;
private int[,,] g;
private GameObject[,] cube;
void Start()
{
g = new int[x_grid, y_grid, 2];
cube = new GameObject[x_grid, y_grid];
for (int x = 0; x < x_grid; x=x+1) {
for (int y = 0; y < y_grid; y=y+1) {
cube[x,y]=GameObject.CreatePrimitive (PrimitiveType.Cube);
cube[x,y].transform.position = new Vector3 (x * 2, 0, y * 2);
cube[x,y].renderer.material.color = new Color(x *0.1f,0,y *0.1f);
cube[x,y].active= false;//Hide
g[Random.Range(x, y),Random.Range(x, y),1] = 1;
}
}
}
void Update()
{
//Lightweight spaceship (LWSS)
if (Input.GetKeyDown("f")) {
g[20,10,1] = 1;
g[20,13,1] = 1;
g[21,14,1] = 1;
g[22,14,1] = 1;
g[23,14,1] = 1;
g[23,13,1] = 1;
g[23,12,1] = 1;
g[23,11,1] = 1;
g[22,10,1] = 1;
}
for (int x = 0; x < x_grid; x=x+1)
{
for (int y = 0; y < y_grid; y=y+1)
{
if ((g[x,y,1] == 1) || (g[x,y,1] == 0 && g[x,y,0] == 1))
{
g[x,y,0] = 1;
cube[x,y].active= true;//Show
}
if (g[x,y,1] == -1)
{
g[x,y,0] = 0;
cube[x,y].active= false;//Hide
}
g[x,y,1] = 0;
}
}
for (int x = 0; x < x_grid; x=x+1)
{
for (int y = 0; y < y_grid; y=y+1)
{
int count = gen(x, y);
if (count == 3 && g[x,y,0] == 0)
{
g[x,y,1] = 1;
}
if ((count < 2 || count > 3) && g[x,y,0] == 1)
{
g[x,y,1] = -1;
}
}
}
}
int gen(int x, int y)
{
return g[(x + 1) % x_grid, y, 0] + g[x, (y + 1) % y_grid, 0]+ g[(x + x_grid - 1) % x_grid,y,0] + g[x,(y + y_grid - 1) % y_grid,0]+ g[(x + 1) % x_grid,(y + 1) % y_grid,0] + g[(x + x_grid - 1) % x_grid,(y + 1) % y_grid,0] + g[(x + x_grid - 1) % x_grid,(y + y_grid - 1) % y_grid,0] + g[(x + 1) % x_grid,(y + y_grid - 1) % y_grid,0];
}
}
"F" Создать "Космический корабль"
А как туман вокруг Сферы сделать?
Последний раз редактировалось Foxymist, 24.07.2016 в 18:04.
Причина: Неправильная ссылка на вложение.
|
(Offline)
|
|
24.07.2016, 17:59
|
#9
|
Нуждающийся
Регистрация: 29.06.2016
Сообщений: 80
Написано 28 полезных сообщений (для 52 пользователей)
|
Ответ: Mistshift Обучение
Какие альтернативы у команд PickedEntity EntityPickMode LinePick TFormVector TFormNormal
Вообще что искать, для Unity, чтобы кликнул по сфере и над ней появился куб в том месте где
кликнул. И чтоб повёрнут он был нормалями к сфере.
Я не знаю как это сформулировать для Unity в гугле.
|
(Offline)
|
|
25.07.2016, 06:30
|
#10
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Mistshift Обучение
http://www.shgames.ru/index.php?titl...авная_страница
PickedEntity - http://www.shgames.ru/index.php?titl...ера:CameraPick
TFormPick и некоторых других нет в Юнити, но это не значит что все плохо. Данные о нормалях как я помню есть в свойствах Raycast. По ссылке выше пример и там у переменной "hit" через точку можно получить доступ ко многим вещам которые тебе помогут.
Последний раз редактировалось Nex, 25.07.2016 в 08:48.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.07.2016, 13:49
|
#11
|
Нуждающийся
Регистрация: 29.06.2016
Сообщений: 80
Написано 28 полезных сообщений (для 52 пользователей)
|
Ответ: Mistshift Обучение
Не понял, почему в этом случае;
// Если не попали в какой-либо объект - выходим из функции if (!Physics.Raycast(ray, out hit)) return;
фигурные скобки не используем?
|
(Offline)
|
|
25.07.2016, 14:11
|
#12
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Mistshift Обучение
Сообщение от Foxymist
Не понял, почему в этом случае;
// Если не попали в какой-либо объект - выходим из функции if (!Physics.Raycast(ray, out hit)) return;
фигурные скобки не используем?
|
Потому что опять же в большинстве современных c/java - подобных языках можно не использовать скобки если выражение условия или функции в одну строку.
Если бы было так, то скобки нужны были бы. Иначе либо ошибка, либо "return" будет срабатывать уже не в условии, а в функции из которой это условие вызывается.
// Если не попали в какой-либо объект - выходим из функции if (!Physics.Raycast(ray, out hit)) int a = 1; return;
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.07.2016, 14:56
|
#13
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Mistshift Обучение
Чувввак, ты сначала сделай так:
http://mycsharp.ru/
А потом уже пиши. Хотя бы основы ведь нужно знать, а то вопросы тупо из-за не знания синтаксиса.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо RegIon за это полезное сообщение:
|
|
25.07.2016, 16:48
|
#14
|
Нуждающийся
Регистрация: 29.06.2016
Сообщений: 80
Написано 28 полезных сообщений (для 52 пользователей)
|
Ответ: Mistshift Обучение
Сообщение от RegIon
Чувввак, ты сначала сделай так:
http://mycsharp.ru/
А потом уже пиши. Хотя бы основы ведь нужно знать, а то вопросы тупо из-за не знания синтаксиса.
|
А ты вовремя а то я сижу и не пойму, почему одна переменная, показывает в Debug.Log(p0); три значения “XYZ” а оказывается это массив p0[0], p0[1],p0[2]
Ну, я как то так учусь. Спасибо за ссылку полезный ресурс.
|
(Offline)
|
|
26.07.2016, 13:47
|
#15
|
Нуждающийся
Регистрация: 29.06.2016
Сообщений: 80
Написано 28 полезных сообщений (для 52 пользователей)
|
Ответ: Mistshift Обучение
Теперь куб двигается над сферой по нажатие левой кнопки мыши, так как надо.
Для того чтобы куб смотрел в центр сферы использовал этот урок
using UnityEngine; using System.Collections; public class FauxGravityAttractor : MonoBehaviour { public float gravity = -12; public void Attract(Transform body) { Vector3 gravityUp = (body.position - transform.position).normalized; Vector3 localUp = body.up; body.rigidbody.AddForce(gravityUp * gravity); Quaternion targetRotation = Quaternion.FromToRotation(localUp,gravityUp) * body.rotation; body.rotation = Quaternion.Slerp(body.rotation,targetRotation,50f * Time.deltaTime ); } }
using UnityEngine; using System.Collections; [RequireComponent (typeof (Rigidbody))] public class FauxGravityBody : MonoBehaviour { public FauxGravityAttractor attractor; private Transform myTransform; void Start () { rigidbody.useGravity = false; rigidbody.constraints = RigidbodyConstraints.FreezeRotation; myTransform = transform; } void FixedUpdate () { if (attractor){ attractor.Attract(myTransform); } } }
Теперь в планах сделать, чтобы при клике вращалась сама сфера.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:38.
|