forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на Unity (http://forum.boolean.name/forumdisplay.php?f=147)
-   -   Mistshift Обучение (http://forum.boolean.name/showthread.php?t=20363)

Foxymist 22.07.2016 23:22

Mistshift Обучение
 
Вложений: 1
Вот набросал для RTS как всё выглядеть должно.
Unity скачал.
Создал сферу.
А как туман вокруг неё сделать? Чтобы он собирался харвестером.



Foxymist 23.07.2016 01:20

Ответ: Mistshift Обучение
 
Вложений: 1
На юнити не работает математика, а почему я не понимаю…
Вот 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

Foxymist 23.07.2016 02:43

Ответ: Mistshift Обучение
 
Всё, на сегодня я закончил, 1:0 в пользу Unity(Первый день разработки прошел удачно). Всё против меня, обс тормозит, лг не считает, Unity3D.
Надо поспать и начать сначала. Да новых встреч.
С вами был Foxymist - программист, мой член стал больше на целый миллиметр.

ABTOMAT 23.07.2016 13:51

Ответ: 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];

Можно и нужно применять ООП, потому что в таком виде код будет разобрать сложно, отсюда и ошибки.

Но в целом здорово что ты сам разобрался как портировать.

Foxymist 23.07.2016 16:06

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от ABTOMAT (Сообщение 307330)
Вряд ли кто-то будет ползать с лупой по чужому коду, выискивая, что же не так.
Выводи по очереди в лог (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” мне не надо “>” мне надо “=” но с равно выдаёт ошибку сам юнити.

А так, я нарочно упростил алгоритм, чтобы проще было портировать.

ООП? не понимаю о чём ты хочешь мне сказать, почитал за ООП в вики;

Цитата:

Объе́ктно-ориенти́рованное программи́рование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования
Если можно, поясни пожалуйста, так как у меня всего два объекта Сфера и Куб.

Пошел второй день обучения.

Nex 23.07.2016 16:17

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от Foxymist (Сообщение 307331)
почему в Blitz я могу писать так If (x1)<>0 Or (y1)<>0 а в юнити нет

Потому что Блитз древний. Сейчас во всех языках надо так:
PHP код:

If (x1) != 

x1 значение может быть любым, но должно быть не равно 0 что-бы условие сработало.

Цитата:

Сообщение от Foxymist (Сообщение 307331)
Или в юнити например if (c>=2)
почему “c>=2” а не “с=2” мне не надо “>” мне надо “=” но с равно выдаёт ошибку сам юнити.

Для проверки на равенство надо
PHP код:

if (== 2

В современных языках "=" это значить присвоить значение, а "==" сравнить значения.

Выражение ">=" или "<=" в Юнити работает так же как и в Блитзе.

Цитата:

Сообщение от Foxymist (Сообщение 307331)
ООП? не понимаю о чём ты хочешь мне сказать


Foxymist 23.07.2016 17:09

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от Nex (Сообщение 307332)
Потому что Блитз древний. Сейчас во всех языках надо так:
PHP код:

If (x1) != 

x1 значение может быть любым, но должно быть не равно 0 что-бы условие сработало.


Для проверки на равенство надо
PHP код:

if (== 2

В современных языках "=" это значить присвоить значение, а "==" сравнить значения.

Выражение ">=" или "<=" в Юнити работает так же как и в Блитзе.



Полиморфизм - это то, что мне понадобиться, да и в целом полезный урок спасибо.
Получается все эти массивы (которые я нагороди, не нужны) мне и одного массива будет достаточно.

Foxymist 24.07.2016 01:24

Ответ: Mistshift Обучение
 
Вложений: 1
Вот так работает;
Код:

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 17:59

Ответ: Mistshift Обучение
 
Вложений: 1
Какие альтернативы у команд PickedEntity EntityPickMode LinePick TFormVector TFormNormal
Вообще что искать, для Unity, чтобы кликнул по сфере и над ней появился куб в том месте где
кликнул. И чтоб повёрнут он был нормалями к сфере.
Я не знаю как это сформулировать для Unity в гугле.


Nex 25.07.2016 06:30

Ответ: Mistshift Обучение
 
http://www.shgames.ru/index.php?titl...авная_страница

PickedEntity - http://www.shgames.ru/index.php?titl...ера:CameraPick

TFormPick и некоторых других нет в Юнити, но это не значит что все плохо. Данные о нормалях как я помню есть в свойствах Raycast. По ссылке выше пример и там у переменной "hit" через точку можно получить доступ ко многим вещам которые тебе помогут. :)

Foxymist 25.07.2016 13:49

Ответ: Mistshift Обучение
 
Не понял, почему в этом случае;
PHP код:

// Если не попали в какой-либо объект - выходим из функции
        
if (!Physics.Raycast(rayout hit))
            return; 

фигурные скобки не используем?

Nex 25.07.2016 14:11

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от Foxymist (Сообщение 307373)
Не понял, почему в этом случае;
PHP код:

// Если не попали в какой-либо объект - выходим из функции
        
if (!Physics.Raycast(rayout hit))
            return; 

фигурные скобки не используем?

Потому что опять же в большинстве современных c/java - подобных языках можно не использовать скобки если выражение условия или функции в одну строку.
Если бы было так, то скобки нужны были бы. Иначе либо ошибка, либо "return" будет срабатывать уже не в условии, а в функции из которой это условие вызывается.
PHP код:

// Если не попали в какой-либо объект - выходим из функции
if (!Physics.Raycast(rayout hit))
     
int a 1;
     return; 


RegIon 25.07.2016 14:56

Ответ: Mistshift Обучение
 
Чувввак, ты сначала сделай так:
http://mycsharp.ru/

А потом уже пиши. Хотя бы основы ведь нужно знать, а то вопросы тупо из-за не знания синтаксиса.

Foxymist 25.07.2016 16:48

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от RegIon (Сообщение 307376)
Чувввак, ты сначала сделай так:
http://mycsharp.ru/

А потом уже пиши. Хотя бы основы ведь нужно знать, а то вопросы тупо из-за не знания синтаксиса.

А ты вовремя:) а то я сижу и не пойму, почему одна переменная, показывает в Debug.Log(p0); три значения “XYZ” а оказывается это массив:-) p0[0], p0[1],p0[2]
Ну, я как то так учусь. Спасибо за ссылку полезный ресурс.

Foxymist 26.07.2016 13:47

Ответ: Mistshift Обучение
 
Вложений: 1
Теперь куб двигается над сферой по нажатие левой кнопки мыши, так как надо.
Для того чтобы куб смотрел в центр сферы использовал этот урок

PHP код:

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 );
    }   



PHP код:

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);
        }
    }
    


Теперь в планах сделать, чтобы при клике вращалась сама сфера.

Foxymist 26.07.2016 14:43

Ответ: Mistshift Обучение
 
Вложений: 1
Всё просто:)
http://shgames.ru/index.php?title=%D...BE%D0%BD%D1%8B
Пример использования сферической интерполяции в Unity3D
PHP код:

// Интерполяция между двумя вращениями.
// (Назначьте два разных объекта на переменные from и to 
// и данный объект повернется начиная с вращения первого, 
// приняв в итоге вращение второго )
 
using UnityEngine;
 
public class 
example MonoBehaviour {
    public 
Transform from;
    public 
Transform to;
    public 
float speed 0.1F;
    
void Update() {
        
transform.rotation Quaternion.Slerp(from.rotationto.rotationTime.time speed);
    }


Теперь и планета поворачивается в место клика:)

Nex 26.07.2016 15:01

Ответ: Mistshift Обучение
 
Есть еще куча официальных уроков как по юнити3д так и по C#.
http://unity3d.com/learn/tutorials

Естественно, что все на английском.

Foxymist 27.07.2016 02:22

Ответ: Mistshift Обучение
 
Вложений: 1
Доделал то, что хотел, что то получается уже:)

Для перемещения по сфере можно кликать по ней, кликать по кубам для перемещения к ним, расставлять “Станции” пробелом. Сейчас можно ставить друг в друга “Станции”

Дальше в планах ООП, уже сейчас чувствую что необходимо.

RegIon 27.07.2016 08:54

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от Foxymist (Сообщение 307424)
Дальше в планах ООП, уже сейчас чувствую что необходимо.

:4to:чего? Т.е ты на шарпе до этого без него писал типо? :crazy:

Foxymist 27.07.2016 12:39

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от RegIon (Сообщение 307431)
:4to:чего? Т.е ты на шарпе до этого без него писал типо? :crazy:

Типо. Несовсем так, вот он пишет;

https://habrahabr.ru/post/148015/
Цитата:

1. Наследование. Есть пекарь. Есть печь электрическая и газовая. Ваша задача смоделировать процесс приготовления пищи пекарем в каждой из печи. Решая задачу в лоб, у нас будет много дублирования кода из-за того, что сам процесс передачи пищи в печь и сама работа с печами идентичны для обеих печей. Но если мы включаем объектное мышление, и вспоминаем про инструмент наследование, то получаем примерно следующее (диаграмму лень рисовать, сорри):
Есть печь (абстрактная печь). У нее есть поведение — включить, выключить, увеличить или уменьшить температуру, положить чего-то, достать чего-то и состояние — температура в печи, включена или выключена. Это отличный пример абстрактного объекта в котором соблюдены принципы инкапсуляции (при реализации я их обязательно буду соблюдать). И есть пекарь, конкретный такой пекарь Иван. Он умеет работать с абстрактной печью. Т.е. смотреть температуру, включать выключать и т.д. вы поняли. Сила наследования в том, что нам не придется переписывать нашего Ивана для каждой из печей, будь то электро или газовая печь. Я думаю всем ясно почему? Получается что инструмент применен правильно.
А у меня есть скрипт “PickedEntity” он двигает сферу при клике(Камеру вокруг сферы) а вчера я продублировал его “PickedEntity1” и добавил возможность клонирования объекта(Станции - куба)
Вот и понял, что тут чтото не так, а конкретно я не использую ООП а надо бы.
Я не особо в этом разбираюсь, возможно, неправильно выразился.:dontknow:

Nex 27.07.2016 15:21

Ответ: Mistshift Обучение
 
Ты вообще ничего пока что не понял. :)

Цитата:

Сообщение от Foxymist (Сообщение 307440)
А у меня есть скрипт “PickedEntity” он двигает сферу при клике(Камеру вокруг сферы) а вчера я продублировал его “PickedEntity1” и добавил возможность клонирования объекта(Станции - куба)
Вот и понял, что тут чтото не так, а конкретно я не использую ООП а надо бы.

Это называется Entity Component System.
У тебя на сцене есть объект и по сути это просто точка в пространстве как в блитзе пивот (CreatePivot()). На нем есть уже стандартные от юнити3д компоненты (Transform, Renderer, etc) и ты еще навешиваешь свои компоненты (скрипты), которые им или другими объектами как то манипулируют.

Цитата:

Сообщение от Foxymist (Сообщение 307440)
Типо. Несовсем так, вот он пишет;
https://habrahabr.ru/post/148015/

У тебя вот есть станция. Если ты захочешь добавить еще одну станцию, то ты вероятно как в блитзе начнешь писать новый код для этой станции. Но если подумать, то у станций если некоторые одинаковые возможности. Допустим стандартная возможность это продать станцию.
В случае без ООП ты будешь писать два раза функцию ПродатьСтанцию1() и ПродатьСтанцию2().
С ООП ты можешь сделать базовый класс для станций.
PHP код:

public class Station {
    protected 
int cost 100 // цена станции

    
public virtual void Sell(){     // функция продажи станции
        
playerMoney += cost 2;    // возвращаем половину цены за станцию в казну
    
}


Далее код станции Харвестера:
PHP код:

// создаем новый класс для Харвестера
public class StationHarvester Station //  и наследуем возможности из класса "Station"
// и вдруг оказалось, что Харвестер при постройке занимает
// 10 единиц электричества (привет Red Alert, C&C: Generals)
// и соответственно нужно возвращать в казну эти 10 единиц электричества, но 
// в базовой функции продажи такой возможности нет. Поэтому нужно изменить функцию (перезаписать).

    
public override void Sell(){
        
playerEnergy += 10;        // новая возможность (возвращение энергии)
        
base.Sell();             // и при этом через base.Sell() мы вызываем стандартную функцию продажи, которая 
                                // возвращает деньги за станцию.
    
}


1. Меньше кода нужно писать ведь функция Sell может быть огромная, а тут изменили одну строку при той же
функциональности.
2. Если нужно все переделать, то это будет легко и все внезапно не перестанет работать так как все
разложено по полочкам (по классам), а не как в Блитзе все в одной куче.

Главное не слишком увлекаться "разбиением" по классам и функциям. Еще есть интерфейсы, но это уже другая история.

playerEnergy += 10; - "+=" это тоже самое, что и "playerEnergy = playerEnergy + 10;"
virtual - это ключевое слово значит, что если это класс кто-то наследует, то эту функцию можно изменить.
override - это ключевое слово значит, что мы изменяем (перезаписываем) функцию, которая кстати должна быть помечена ключевым словом virtual.
Вроде можно изменять (перезаписывать) функцию в лоб просто объявив новую с таким же именем, но тогда мы потеряем возможности старой функции и это вроде не совсем правильно.

Пример не самый лучший, но возможно поможет не много разобраться. :)

Foxymist 28.07.2016 19:50

Ответ: Mistshift Обучение
 
Вложений: 1
Изменил управление так вроде удобнее.

Использовал этот пример: http://wiki.unity3d.com/index.php/Mo...fiteRotateZoom

Обзор - Зажать правую кнопку мыши + двигаем мышь.
Зум -Скроллинг .
Передвинуть орбитальную станцию; Клик по сфере левая кнопка мыши.
Строить можно только там, где орбитальная станция и в определённом радиусе вокруг неё.
Стройка – Пробел.
Планета вращается вокруг звезды.

Foxymist 31.07.2016 01:24

Ответ: Mistshift Обучение
 
Вложений: 3
Вот что готово;
Немного осваивая ГУИ написал вот такой скрипт ;
PHP код:

using UnityEngine;
using System.Collections;

public class 
NameUnit MonoBehaviour {

    private 
RaycastHit hit;
    public 
string UnitName;
    public 
Color ColorText;
    public 
int UnitHP;
    public 
int HP=0;
    public 
Color ColorHP;
    public 
int UnitEnergy;
    public 
int E=0;
    public 
Color ColorEnergy;
    private 
float distanceVector;
    public 
Transform AlienUnit;

    
void Start () {

    }
    
    
Vector3 TextPos;

    
void OnGUI()
    {

        
TextPos Camera.main.WorldToScreenPoint (transform.position);

    if (
Input.GetKey(KeyCode.Q)) 
       {
     
        
    
GUI.Label (new Rect (TextPos.xScreen.height TextPos.y5050), UnitName);
    
GUI.color Color.black ColorText;
    
GUI.Label (new Rect (TextPos.xScreen.height TextPos.- (20), 5050), "HP:" UnitHP);


        }    
        
//Transform Unit;
        
distanceVector Vector3.Distance (gameObject.transform.position AlienUnit.position);

        if (
distanceVector <2)
        {
        if (
Input.GetKeyDown (KeyCode.F1)) {
            
UnitHP -= 10;
        }

        if (
Input.GetKeyDown (KeyCode.F2)) {
            
UnitEnergy -= 10;
        }


        
//if (Input.GetKeyDown (KeyCode.F3)) {
        //    UnitHP += 10;
        //}
        
        //if (Input.GetKeyDown (KeyCode.F4)) {
        //    UnitEnergy += 10;
        //}
         
}

        
//UnitHP
        
HP UnitHP;

        if (
HP>99){HP=100;}
        if (
HP<1){gameObject.activefalse;}

        
GUI.color Color.black+ColorHP;
        for (
int i 0<HPi=i+1
        
        {
        
            
GUI.Label (new Rect ((TextPos.x+(i)-HP/2), Screen.height TextPos.- (35), 1010), "|");

        }

        
//UnitEnergy
        
UnitEnergy;
        
        if (
E>99){E=100;}
        if (
E<1){E=0UnitEnergy=0;}

        
GUI.color Color.black+ColorEnergy;
        for (
int i 0<Ei=i+1
            
        {
            
            
GUI.Label (new Rect ((TextPos.x+(i)-E/2), Screen.height TextPos.- (30), 1010), "|");
            
        }

    }

    
void Update () 
    {
    
    }


Появилось ХП и Энергия чтобы отнять нужно чтобы зеленый маркер находился рядом c юнитом. “F1” отнять ХП “F2” отнять Энергию.
“Q” подробности. Юнит исчезает если HP=0

Теперь надо обернуть всё в базовый класс ну ООП вобщем…

Немного разобрался с ГУИ.

На скриншоте с зажатой “Q” подробности.


Foxymist 02.08.2016 23:49

Ответ: Mistshift Обучение
 
Вложений: 2
Немного продвинулся в перёд :
Теперь харвестер сосёт туман, количество и скорость всасываемого, зависит от дистанции между харвестером и орбитальной станцией.

На планете простой скрипт, имя планеты, общее количество тумана и сколько тумана осталось.

В верхнем левом углу, отображается - количество собранного тумана.
Немного оптимизировал скрип:

PHP код:

using UnityEngine;
using System.Collections;

public class 
NameUnit MonoBehaviour {

    public static 
NameUnit Instance get; private set; }
    
    public 
string UnitName;
    public 
Color ColorText;

    public 
float UnitHP;
    public 
Color ColorHP;

    public 
float UnitEnergy;
    public 
Color ColorEnergy;
    
    public 
float Resurs;
    public 
Color ColorResurs;

    private 
float distanceVector;
    public 
float distanceOrbitalStation;

    public 
Transform AlienUnit;
    public 
Transform OrbitalStationUnit;
    
    private 
float HarvestMistRes;

    public 
bool componentHarvest;

    
void Start () {

        
//HarvestMistRes = Mist.Instance.MistPlanet;
    
}


    public 
void Awake()
    {
        
Instance this;
    
    }


    
Vector3 TextPos;

    
void OnGUI()
    {
          
                
TextPos Camera.main.WorldToScreenPoint (transform.position);

                if (
Input.GetKey (KeyCode.Q)) {
     
                
GUI.Label (new Rect (TextPos.xScreen.height TextPos.y5050), UnitName);
                
GUI.color Color.black ColorText;
                
GUI.Label (new Rect (TextPos.xScreen.height TextPos.- (20), 5050), "HP:" UnitHP);

                }    

        if (
componentHarvest == true) {GUIResursProgress (ResursColorResurs40);}

        
GUIResursProgress (UnitHPColorHP35);
        
GUIResursProgress (UnitEnergyColorEnergy30);

              }

    
void Update () 
    {


        
distanceVector DistanceUnit(gameObject.transformAlienUnit);

        
distanceOrbitalStation DistanceUnit(gameObject.transformOrbitalStationUnit);

        
        if (
Input.GetKeyDown (KeyCode.F1) && distanceVector<5) {UnitHP-=10;}
        
        
//UnitHP
        
UnitHP=HPUnit(UnitHP,gameObject);

        
//UnitEnergy
        
if (distanceOrbitalStation 20) {UnitEnergy Energy(UnitEnergy,100,20,1);}
        
        if (
distanceOrbitalStation 20) {UnitEnergy Energy(UnitEnergy,100,20,0);}

        
//UnitResurs
        
if (componentHarvest == true) {Resurs ResursLimit (80Resurs100UnitEnergy20);}

    }

    
//Function=====================================================================================================================================
    
public void GUIResursProgress(float ResursGUIColor ResursColorint TextYPos)
        
    {
        
        
GUI.color Color.black ResursColor;
        for (
int i 0<ResursGUIi=i+1
        {
            
            
GUI.Label (new Rect ((TextPos.+ (i) - ResursGUI 2), Screen.height TextPos.- (TextYPos), 5050), ".");
            
        }

    }

    public static 
float DistanceUnit(Transform A,Transform B)

    {
        return 
Vector3.Distance (A.positionB.position);
    }


    public static 
float HPUnit(float HPGameObject gameObject)

    {
        if (
HP 100) {HP 100;}
        
        if (
HP 1) {gameObject.active false;}

        return 
HP;
    }

    public static 
float Energy(float E,float Max,float Min int FlagIE)
        
    {

        if (
FlagIE == 

        {
             
+= 10f TimeRTS ();
        
            if (
Max) {=Max;}
        }


        if (
FlagIE == 
        {
            
-= 10f TimeRTS ();

            if (
Min ) {Min;}
            
        }


        return 
E;
    }
    
    public static 
float ResursLimit(float UpdateHarvest ,float ResursHarvestfloat MaxResursfloat ResursEnergyfloat EnergyDist)
        
    {
        if (
Mist.Instance.MistPlanet 0

                 {

                        if (
ResursHarvest MaxResurs && ResursEnergy EnergyDist) {
                                
ResursHarvest += 50f TimeRTS ();
                        }

                        if (
ResursHarvest MaxResurs && ResursEnergy == EnergyDist) {
                                
ResursHarvest += 10f TimeRTS ();
                                
UpdateHarvest=99.9f;
                        }
        
                        if (
ResursHarvest MaxResurs) {
                                
ResursHarvest 0;
                        } 

                        if (
ResursHarvest MaxResurs && ResursHarvest UpdateHarvest && Mist.Instance.MistPlanet 0) {
            
                          
Mist.Instance.MistPlanet--;//Resurs

                        
}

             }

        return 
ResursHarvest;
        
    }
    
    public static 
float TimeRTS(float t=1.0f )
        
    {
        return 
Time.deltaTime*t;
    }
//Function=====================================================================================================================================    


Управление осталось тем же Узнать о планете больше “Q”
Обзор - Зажать правую кнопку мыши + двигаем мышь.
Зум -Скроллинг .
Передвинуть орбитальную станцию; Клик по сфере левая кнопка мыши.
Строить можно только там, где орбитальная станция и в определённом радиусе вокруг неё.
Стройка – Пробел.
Сейчас в планах сделать GUI механизм покупки – продажи.

Taugeshtu 03.08.2016 01:46

Ответ: Mistshift Обучение
 
А можно ты не будешь вываливать километровые листинги кода, а вместо этого, как белый человек, дашь ссылку на гитхаб с сорцами? Интересующиеся заглянут, а нам простыни пролистывать не придётся...

impersonalis 03.08.2016 12:39

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от Nex (Сообщение 307447)
PHP код:

playerMoney += cost 2;    // возвращаем половину цены за станцию в казну 


После пары подстав от MATLAB, такие конструкции вызывают у меня неудобство. Укажите явно: ЧТО делать с дробной частью (в общем случае, возможны 4 варианта) до её каста к типу операнда слева - floor, ceil, round, fix?

Nex 03.08.2016 14:18

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от impersonalis (Сообщение 307620)
После пары подстав от MATLAB, такие конструкции вызывают у меня неудобство. Укажите явно: ЧТО делать с дробной частью (в общем случае, возможны 4 варианта) до её каста к типу операнда слева - floor, ceil, round, fix?

Цитата:

protected int cost = 100 // цена станции
Думаю тут в любом случае будет 50. И если указать 2.0 или 2f, то вероятно C# сообщит о том, что float не может быть int.
Или я не правильно что-то понял?

Foxymist 03.08.2016 14:18

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от Taugeshtu (Сообщение 307615)
А можно ты не будешь вываливать километровые листинги кода, а вместо этого, как белый человек, дашь ссылку на гитхаб с сорцами? Интересующиеся заглянут, а нам простыни пролистывать не придётся...

Хорошо в будущем буду прятать под OFFtop’ы.

impersonalis 03.08.2016 15:38

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от Nex (Сообщение 307629)
Думаю тут в любом случае будет 50. И если указать 2.0 или 2f, то вероятно C# сообщит о том, что float не может быть int.
Или я не правильно что-то понял?

не обращай внимания - я придираюсь. В M могла образоваться даже в априори целом результате единичка где-нить на n-ой позиции после запятой (т.е. её ещё и невидно при стандартном выводе), что при округлении в бОльшую сторону добавляло аж единицу.

Foxymist 06.08.2016 15:29

Ответ: Mistshift Обучение
 
Вложений: 1
Не стал делать GUI, просто почитал у вас тут http://forum.boolean.name/forumdisplay.php?f=167
там всё просто, мне нужно только определиться, каким оно должно быть, и какой метод использовать.

Новое; сделал основу для выбора и покупки юнитов , пока их два HarvestStation за 100 “Тумана” и ProtectStation за 10 “Тумана”
ProtectStation просто как альтернатива для тестирования (Пустышка) но её можно убить.

Выбор что строить цифры 1,2… выйти из режима строительства правая кнопка мыши.

Изначально у вас 100 тумана советую приобрести HarvestStation.

Нужно ещё пару мелочей дописать и дальше проще будет, пиши себе скрипты да придумывай
юнитов.

Энергия теперь отнимается нормально и скорость добычи тоже.
PHP код:

UnitEnergy Energy(UnitStaticEnergy-distanceOrbitalStation,100,20,1);

Resurs ResursLimit (100-(UnitEnergy/32), Resurs100); 


Nex 06.08.2016 18:16

Ответ: Mistshift Обучение
 
Все эти магические цифры лучше задавать в переменных с осмысленным названием и подставлять эти переменные в нужных местах иначе с первого взгляда не понятно что к чему. Да и вообще потом можно будет самому запутаться в коде.

Foxymist 06.08.2016 18:39

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от Nex (Сообщение 307679)
Все эти магические цифры лучше задавать в переменных с осмысленным названием и подставлять эти переменные в нужных местах иначе с первого взгляда не понятно что к чему. Да и вообще потом можно будет самому запутаться в коде.

В конце - концов, всё сведу к автомату, конкретно эти цифры я не забуду, они с прокачкой связанны(Скорость добычи ресурсов). Пака экспериментирую.

Nex 07.08.2016 03:51

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от Foxymist (Сообщение 307680)
конкретно эти цифры я не забуду, они с прокачкой связанны(Скорость добычи ресурсов).

1. Это ты так думаешь. Когда код будет большой, то начнется анал с вспоминанием чо да как работает. Кстати вероятно именно по этому и придумали когда то ООП.
2. Ты привел код в цитатах в прошлом сообщении дабы нам показать? Но вероятно никто не понял что это за цифры и для чего они. Поэтому смысл был в этих цитатах? :)

Еще в прошлых сообщениях в коде был у тебя у станций параметр Color. Я так понимаю, что это типа цвета фракции или стороны? Так вот, такое лучше внести в отдельный класс/лист и уже выбирать "готовые" цвета для станции. Так как это фактически получается жестко прописанные константы.
И может однажды по не внимательности получится так, что при двух игроках (красного и синего цвета) может появится допустим станция зеленого цвета принадлежащая одному из игроков из-за того, что ты где то в коде меняешь не те циферки.

Foxymist 07.08.2016 13:55

Ответ: Mistshift Обучение
 
Цитата:

Сообщение от Nex (Сообщение 307683)
1. Это ты так думаешь. Когда код будет большой, то начнется анал с вспоминанием чо да как работает. Кстати вероятно именно по этому и придумали когда то ООП.
2. Ты привел код в цитатах в прошлом сообщении дабы нам показать? Но вероятно никто не понял что это за цифры и для чего они. Поэтому смысл был в этих цитатах? :)

Еще в прошлых сообщениях в коде был у тебя у станций параметр Color. Я так понимаю, что это типа цвета фракции или стороны? Так вот, такое лучше внести в отдельный класс/лист и уже выбирать "готовые" цвета для станции. Так как это фактически получается жестко прописанные константы.
И может однажды по не внимательности получится так, что при двух игроках (красного и синего цвета) может появится допустим станция зеленого цвета принадлежащая одному из игроков из-за того, что ты где то в коде меняешь не те циферки.

Мне сложно что-либо ответить, я мало разбираюсь пока что, но я тебя услышал и понял о чём ты.
Раньше всё выглядело так;
PHP код:

if (distanceOrbitalStation 20) {UnitEnergy Energy(UnitEnergy,100,20,1);} 
         
 if (
distanceOrbitalStation 20) {UnitEnergy Energy(UnitEnergy,100,20,0);} 

 
//UnitResurs 
 
if (componentHarvest == true) {Resurs ResursLimit (80Resurs100UnitEnergy20);} 

работало как часы, но это не то, фиксированная дистанция 20 это не то что мне было нужно, я тупил и не знал как мне distanceOrbitalStation с обратным значением получить .
(if (componentHarvest == true) это просто для галочки в инспекторе скрипт был один для двух разных юнитов)
Патом сделал;
PHP код:

UnitEnergy Energy(UnitStaticEnergy-distanceOrbitalStation,100,20,1); 

Resurs ResursLimit (100-(UnitEnergy/32), Resurs100); 

Color? фракции я ещё не раскрашивал, даже и не думал об этом, это GUI.color = Color.black + ColorText; вообще импровизация, хотел менять цвет в инспекторе HP Energy и да ты прав (такое лучше внести в отдельный класс/лист) но я учусь, мне надо понимать как что работает.


Часовой пояс GMT +4, время: 10:47.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot