forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Unity (http://forum.boolean.name/forumdisplay.php?f=144)
-   -   Фак по Юнити. (http://forum.boolean.name/showthread.php?t=12966)

ant2on 22.08.2012 12:45

Ответ: Фак по Юнити.
 
50 советов по работе с Unity (eng)
http://devmag.org.za/2012/07/12/50-t...est-practices/

Smart Unity programmers tips from ESE
https://docs.google.com/document/d/1...nnE/edit?pli=1

Andvrok 26.01.2013 02:10

Ответ: Фак по Юнити.
 
Не могу использовать стандартный фпс-контролер при работе с сетью. С редактора всё работает, но в скомпилированом приложении при попытке движения сыпятся
Цитата:

transform.localPosition assign attempt for 'mpPlayer(Clone)' is not valid. Input localPosition is { NaN, 2.000000, NaN }.
Если не использовать фпс-контролер, всё отлично.
Что я делаю не так?

Lestar 26.01.2013 02:45

Ответ: Фак по Юнити.
 
Покажи как двигаешь игрока по сети.

Andvrok 26.01.2013 02:55

Ответ: Фак по Юнити.
 
Фпс-контролером и двигаю.

Lestar 26.01.2013 02:58

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

Andvrok 26.01.2013 03:00

Ответ: Фак по Юнити.
 
Ну я передаю координаты в OnSerializeNetworkView(), этого недостаточно? Самое интересное то, что в редакторе всё работает без ошибок.

Lestar 26.01.2013 03:43

Ответ: Фак по Юнити.
 
Достаточно. Передаешь и читаешь?

Andvrok 26.01.2013 03:51

Ответ: Фак по Юнити.
 
Ага.

Andvrok 11.02.2013 05:49

Ответ: Фак по Юнити.
 
Уважаемые гуру юнити, и с# в частности. Ни у кого нет желания написать краткий фак по андроиду, либо перевести яваскрипты с standart mobile assets на си-шарп и прокоментировать? Нет, перевести с явы на си-шарп я и сам могу, но хотелось бы разобраться полностью в особенностях написания приложения для смартфона. Курение мануалов даётся со скрипом. Был бы весьма признателен, да и в копилке уроков не помешало бы.

burovalex 21.02.2013 23:06

Ответ: Фак по Юнити.
 
Начал писать LOD, блин, я начинаю влюбляться в юнити, знаю 5% движка, а уже чтото получается )
Написал 3-х ступенчатый LOD, конечно дорабатывать еще надо, но не сегодня (поздновато)

PHP код:

using UnityEngine;
using System.Collections;

public class 
LOD MonoBehaviour {
    public 
Mesh meshHiPolymeshMidPolymeshLowPoly;
    public 
int lodLevelcurrentLodLevel;
    public 
float distanceHiPolydistanceMidPoly;
    public 
float distance;
    public 
Camera thisCamera;
    
// Use this for initialization
void Start () 
    {
    if (
meshHiPoly!=null) {lodLevel++;} 
    if (
meshMidPoly!=null) {lodLevel++;}
    if (
meshLowPoly!=null) {lodLevel++;}
    
//защита от криворукости )
    
if (lodLevel==&& meshLowPoly!=null) {meshMidPoly=meshLowPolymeshLowPoly=null;}
    if (
lodLevel==&& meshLowPoly!=null) {meshHiPoly=meshLowPolymeshLowPoly=null;}
    if (
lodLevel==&& meshMidPoly!=null) {meshHiPoly=meshMidPolymeshMidPoly=null;}    
    
thisCamera Camera.main;
    }
    
    
// Update is called once per frame
void Update () 
    {
    
distance Vector3.Distance(transform.position,thisCamera.transform.position);
    if (
distance<distanceHiPoly && currentLodLevel!=1)
        {
        
currentLodLevel=1;
        
GetComponent<MeshFilter>().mesh meshHiPoly;
        }
    if (
distance<distanceMidPoly && distance>distanceHiPoly && currentLodLevel!=2)
        {
        
currentLodLevel=2;
        
GetComponent<MeshFilter>().mesh meshMidPoly;
        }
    if (
distance>distanceMidPoly && currentLodLevel!=3)
        {
        
currentLodLevel=3;
        
GetComponent<MeshFilter>().mesh meshLowPoly;
        }
    }



Сделал чтобы пользователь ложил меши сам, но косяк в том, что материалы должны быть разные.
Наверное самый простой вариант это префабы ложить?
И еще вопрос, как можно сделать такой же скроллер дистанций как в Про версии LOD'a ?
А еще как можно достать уровень графики, ну чтобы знать fantastic она или normal..?

Также, если у меня чтото сильно коряво, пишите!

pax 21.02.2013 23:24

Ответ: Фак по Юнити.
 
1. Материал назначить renderer.sharedMaterial = myMaterial;
2. Для того чтобы написать скроллер надо писать кастомный редактор своего скрипта (компонента).
3. http://docs.unity3d.com/Documentatio...lityLevel.html

burovalex 22.02.2013 09:34

Ответ: Фак по Юнити.
 
Вложений: 1
Вопрос появился, по поводу маски, но нарыл ответ, опять же спасибо тебе )
Нашел в одном ответе ты дал ссылку на шейдер маски, вот только там очень не хватает выбора основного цвета. У меня текстуры почти одинаковым цветом.
Помои плиз, можно же как то палитру туда загнать, как например в диффузе, я бы сам с удовольствием сделал, но до CG мне еще очень далеко, я немного только в HLSL работал.

Сам шейдер

PHP код:

Shader "MaskedTexture"
{
   
Properties
   
{
      
_MainTex ("Base (RGB)"2D) = "white" {}
      
_Mask ("Culling Mask"2D) = "white" {}
      
_Cutoff ("Alpha cutoff"Range (0,1)) = 0.1
   
}
   
SubShader
   
{
      
Tags {"Queue"="Transparent"}
      
Lighting Off
      ZWrite Off
      Blend SrcAlpha OneMinusSrcAlpha
      AlphaTest GEqual 
[_Cutoff]
      
Pass
      
{
         
SetTexture [_Mask] {combine texture}
         
SetTexture [_MainTex] {combine textureprevious}
      }
   }



Я понимаю что там надо считать _MainTex c инспектора, но как...
Нашел как пипетку вставить, _Color ("Main Color", Color) = (1,1,1,1)
А вот как сделать связь не могу найти

pax 22.02.2013 09:59

Ответ: Фак по Юнити.
 
В этом шейдере нет CG, тут чистый ShaderLab и следовательно это Fixed Function (OpenGL ES 1.1)

PHP код:

Shader "MaskedTexture"
{
   
Properties
   
{
      
_Color ("Main Color"Color) = (1,1,1,1)
      
_MainTex ("Base (RGB)"2D) = "white" {}
      
_Mask ("Culling Mask"2D) = "white" {}
      
_Cutoff ("Alpha cutoff"Range (0,1)) = 0.1
   
}
   
SubShader
   
{
      
Tags {"Queue"="Transparent"}
      
Lighting Off
      ZWrite Off
      Blend SrcAlpha OneMinusSrcAlpha
      AlphaTest GEqual 
[_Cutoff]
      
Pass
      
{
         
SetTexture [_Mask
         {
             
constantColor [_Color]
             
combine texture constant DOUBLE
         
}
         
SetTexture [_MainTex] {combine textureprevious}
      }
   }


DOUBLE можешь убрать если не нравится

UPD: Хотя я тут вероятно ошибся... а может и будет работать, я вроде маску покрасил и с ней скомбинировал... попробуй

burovalex 22.02.2013 10:59

Ответ: Фак по Юнити.
 
Вложений: 1
СПАСИБО ПАКС!!
Цитата:

UPD: Хотя я тут вероятно ошибся... а может и будет работать, я вроде маску покрасил и с ней скомбинировал... попробуй
Да фигня, главное суть ясна )
Сделал две версии шейдера

MaskedTexture

PHP код:

Shader "MaskedTexture"
{
   
Properties
   
{
         
_Color ("Main Color"Color) = (1,1,1,1)
      
_MainTex ("Base (RGB)"2D) = "white" {}
      
_Mask ("Culling Mask"2D) = "black" {}
      
_Cutoff ("Alpha cutoff"Range (0,1)) = 0.1
   
}
   
SubShader
   
{
      
Tags {"Queue"="Transparent"}
      
Lighting Off
      ZWrite Off
      Blend SrcAlpha OneMinusSrcAlpha
      AlphaTest GEqual 
[_Cutoff]
      
Pass
      
{
         
SetTexture [_Mask
             {
             
constantColor [_ColorMask]
             }
         
SetTexture [_MainTex
             { 
             
constantColor [_Color
             
combine texture constantprevious
             
}
      }
   }





MaskedTexture Fast

PHP код:

Shader "MaskedTexture Fast"
{
   
Properties
   
{
   
_Color ("Main Color"Color) = (1,1,1,1)
      
_MainTex ("Base (RGB)"2D) = "white" {}
      
_Mask ("Culling Mask"2D) = "black" {}
      
_Cutoff ("Alpha cutoff"Range (0,1)) = 0.1
   
}
   
SubShader
   
{
      
Tags {"Queue"="Transparent"}
      
Lighting Off
      ZWrite On
      AlphaTest GEqual 
[_Cutoff]
      
Pass
      
{
         
SetTexture [_Mask
             {
             
constantColor [_ColorMask]
             }
         
SetTexture [_MainTex
             { 
             
constantColor [_Color
             
combine texture constantprevious
             
}
      }
   }




Расскажу в чем разница, в втором варианте я оставил включенном Z-буффер и отключил альфа смешивание Blend SrcAlpha OneMinusSrcAlpha. На сколько я понимаю, таким образом должно работать быстрее, если нет, сообщите.

Слева на рисунке фаст, разница не большая, а при использовании на большом расстоянии вообще остуствует.

pax 22.02.2013 11:53

Ответ: Фак по Юнити.
 
Там вероятно я недописал во второй SetTexture
PHP код:

SetTexture [_MainTex] {combine texture previousprevious

т.е. вероятно правильно вот так
PHP код:

Shader "MaskedTexture"
{
   
Properties
   
{
      
_Color ("Main Color"Color) = (1,1,1,1)
      
_MainTex ("Base (RGB)"2D) = "white" {}
      
_Mask ("Culling Mask"2D) = "white" {}
      
_Cutoff ("Alpha cutoff"Range (0,1)) = 0.1
   
}
   
SubShader
   
{
      
Tags {"Queue"="Transparent"}
      
Lighting Off
      ZWrite Off
      Blend SrcAlpha OneMinusSrcAlpha
      AlphaTest GEqual 
[_Cutoff]
      
Pass
      
{
         
SetTexture [_Mask
         {
             
constantColor [_Color]
             
combine texture constant DOUBLE
         
}
         
SetTexture [_MainTex] {combine texture previousprevious}
      }
   }



burovalex 22.02.2013 13:16

Ответ: Фак по Юнити.
 
Спасибо пакс, да как я сделал тоже норм )
Вот только сейчас заметил большой косяк

PHP код:

using UnityEngine;
using System.Collections;

public class 
LOD MonoBehaviour {
    public 
GameObject prefabHiPolyprefabMidPolyprefabLowPoly;
void Start () 
    {
    
GetComponent<MeshFilter>().mesh prefabHiPoly.GetComponent<MeshFilter>().mesh;
    
GetComponent<Renderer>().material prefabHiPoly.GetComponent<Renderer>().material;


В результате в префабе слетают mesh и material. Что я не так сделал?
В коде я просто беру ссылку меша префаба и ложу в ссылку ГеймОбжекта, и то же самое с материалом.
Их как то надо копировать? А старые компоненты надо зачищать?

pax 22.02.2013 13:20

Ответ: Фак по Юнити.
 
Свойство mesh и material создают новые экземпляры объектов, которые можно менять в рантайме, но обычно это делают над объектами сцены. Для получения ресурсов без ущерба для префаба используй следующее:

PHP код:

using UnityEngine;
using System.Collections;

public class 
LOD MonoBehaviour {
    public 
GameObject prefabHiPolyprefabMidPolyprefabLowPoly;
void Start () 
    {
    
GetComponent<MeshFilter>().sharedMesh prefabHiPoly.GetComponent<MeshFilter>().sharedMesh;
    
GetComponent<Renderer>().sharedMaterial prefabHiPoly.GetComponent<Renderer>().sharedMaterial;



burovalex 22.02.2013 13:34

Ответ: Фак по Юнити.
 
Блин, Паск, ну ты точно Сэнсей!!! ))

burovalex 22.02.2013 16:42

Ответ: Фак по Юнити.
 
Опять встрял и не пойму в чем дело.
Есть два скрипта Plant, Grid. В скрипт Plant я достаю терраин из Grid

PHP код:

public class Grid MonoBehaviour {    
    public  static 
Terrain    thisTerrain;

    
void Awake () {
        
thisTerrain = (Terrain)GetComponent<Terrain>();
}} 

PHP код:

public class Plant MonoBehaviour {
void Start () 
    {
    
transform.position.= (float)Grid.thisTerrain.SampleHeight(transform.position);
}} 

А компилятор кричит что ошибка в строке transform.position.y = (float)Grid.thisTerrain.SampleHeight(transform.pos ition);

error CS1612: Cannot modify a value type return value of `UnityEngine.Transform.position'. Consider storing the value in a temporary variable

Якобы во временных переменных косяк. Но переменные то у меня не временные а публичные и thisTerrain еще и статичная

Разобрался, получается что, transfom.position.y может только хранить значение, но ложить туда нельзя??
И что изменить y, на нужное значение самый простое решение transform.position = newVector3(transform.position.x, 10 , transform.position.z); ?? :4to:

Lestar 22.02.2013 17:34

Ответ: Фак по Юнити.
 
Код:

var position=  transform.position;
 position.y=(float)Grid.thisTerrain.SampleHeight(transform.position);
 transform.position= position;


burovalex 23.02.2013 09:51

Ответ: Фак по Юнити.
 
Помогите оптимально реализовать задачу.
Есть объект со скриптом, который со временем будет создавать такие же объекты с таким же скриптом.
Как лучше задавать значения в новом скрипте?
Т.е. у меня будет допустим один объект трава, второй объект дерево. И они будут размножаться.
Мой вариант такой, при создании нового объекта, в новый скрипт передавать только один параметр (допустим plantType). А при инициализации скрипта делать выборку по plantType.
Мой вариант

PHP код:

... : MonoBehaviour
{
 
enum eType {Grass1=1Tree1Tree2};
 
enum eDensity {Grass1 1Tree1 2};
 
enum eLife {Grass1 3000Tree1 20000};

void Start()
{
if (
plantType eType.Grass1)
{
thisDensity eDensity.Grass1;
thisLife eLife.Grass1;
}
}



Но не удобно что для каждого нового типа придётся дописывать немало строк...
Есть предложения?

pax 23.02.2013 10:05

Ответ: Фак по Юнити.
 
Что-то вроде?
PHP код:

... : MonoBehaviour
{
 public 
enum Type {Grass1=1Tree1Tree2};
 public 
enum Density {Grass1 1Tree1 2};
 public 
enum Life {Grass1 3000Tree1 20000};

public static ... 
Create(string ...nameType typeDensity densityLife life )
{
     var 
myNew... = new GameObject(...name).AddComponent<...>();
     
myNew....thisDensity density;
     
myNew....thisType type;
     
myNew....thisLife  life;
}

void Start()
{

}




burovalex 23.02.2013 12:25

Ответ: Фак по Юнити.
 
Посидел, помозговал и решил сделать отдельный скрипт, хранящий всю нужную инфу, чтобы не таскать её за каждым созданным скриптом.
Получилось так:
Скрипт где хранятся переменные

PHP код:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class 
Database MonoBehaviour {
    public 
enum eType{Grass1=1};
    public 
int eTypeCount=5;
    public static 
byte[] plantDensity;
    public static 
float[] plantSpreadInterval;
    public static 
float[] plantGrowInterval;
    public static 
float[] plantSpreadRadius;

void Awake()
    {
    
plantDensity = new byte[eTypeCount];    
    
plantGrowInterval = new float[eTypeCount];
    
plantSpreadInterval = new float[eTypeCount];
    
plantSpreadRadius = new float[eTypeCount];
    
    
//Grass 1
    
int type = (int)eType.Grass1;
    
plantDensity[type] = 1;
    
plantGrowInterval[type] = 10;
    
plantSpreadInterval[type] = 3;
    
plantSpreadRadius[type] = 1;    
    }



А тут в другом скрипте достаю данные из первого:

PHP код:

switch(plantName)
        {
        case 
"Grass1" :  {plantType=(int)Database.eType.Grass1; break;}
        case 
"Grass2" :  {plantType=(int)Database.eType.Grass1; break;}
        }
    
//считываем параметры
    
growInterval Database.plantGrowInterval[plantType];
    
spreadInterval Database.plantSpreadInterval[plantType]; 


Единственное что у меня не получилось, это узнать сколько в enum хранится констант..

seaman 23.02.2013 13:03

Ответ: Фак по Юнити.
 
Enum.GetNames(typeof(eType)).Length

burovalex 23.02.2013 14:47

Ответ: Фак по Юнити.
 
Нету такого,даже справка ничего не выдала

Andvrok 23.02.2013 16:44

Ответ: Фак по Юнити.
 
PHP код:

using System

допиши.

seaman 23.02.2013 17:39

Ответ: Фак по Юнити.
 
Цитата:

даже справка ничего не выдала
Не забывайте, что Вы пишете на C# под .NET. Соответственно далеко не все есть в справке Юнити. Используйте MSDN

burovalex 23.02.2013 20:37

Ответ: Фак по Юнити.
 
Вложений: 1
Усёк, спасибо! )

Ребят, помогите, вроде ничего особенного не делал, а проект нагнулся походу. Добавлял меши, префабы, к ним цеплял скрипты. Ошибок не показывает а при запуске пишет исправьте перед запуском.

Потом нажал Build and Run и тут у меня высыпалось такое (рисунок в аттаче)
Пробовал удалить добавленные префабы, не помогло..
Пиз*ец, удалил скрипты, проверил - ошибка, закрыл без сохранения, а скрипты всё равно удалились, и ошибка осталась :"(

Нашёл скрипты в Saves/Data/Managed/скрипты. Но они какието другие, в моно ничего по ним не показывает, можно както восстановить???

pax 23.02.2013 20:53

Ответ: Фак по Юнити.
 
Интересная ошибка, никогда такую не видел...

burovalex 23.02.2013 20:56

Ответ: Фак по Юнити.
 
Вложений: 1
Капец, видимо косяк из-за того что с работы собирался, в спящий режим отправил с включённой прогой.
Скрипты то можно както восстановить из того что на скрине??

Andvrok 23.02.2013 21:55

Ответ: Фак по Юнити.
 
У меня была такая ошибка пару раз. К сожалению, я не нашёл способа восстановить скрипты/префабы.

seaman 24.02.2013 00:54

Ответ: Фак по Юнити.
 
Цитата:

Скрипты то можно както восстановить из того что на скрине??
Reflector

pax 24.02.2013 07:43

Ответ: Фак по Юнити.
 
А каким образом повредились скрипты? они же все в папке Assets должны быть? И зачем ты сделал билд в папку ассетов? Там же все dll, которые подключатся к проекту...

burovalex 24.02.2013 08:34

Ответ: Фак по Юнити.
 
Это стандартный путь где хранятся сохраненные сцены, туда и билды он пихает. А скрипты не повредились.

Цитата:

Потом нажал Build and Run и тут у меня высыпалось такое (рисунок в аттаче)
Пробовал удалить добавленные префабы, не помогло..
Пиз*ец, удалил скрипты, проверил - ошибка, закрыл без сохранения, а скрипты всё равно удалились, и ошибка осталась

burovalex 24.02.2013 09:34

Ответ: Фак по Юнити.
 
Ребят помогите разобраться. Начал осваивать корутины, но в моём примере ниже, корутина выполняется только один раз. т.е. FPSCount = 1, и корутина останавливается.
Я скорее всего смысл их не полностью знаю.
Я думал что корутина работает постоянно, пока её не остановишь или return не сделаешь.


PHP код:

using UnityEngine;
using System.Collections;

public class 
Game MonoBehaviour {
    public 
bool showFPS
    public 
int FPSCountFPSResult;
    private 
float FPSTimer;
    
void Start () {
    if (
showFPS == true) {StartCoroutine(ShowFPS());}
    }
    
    
// Update is called once per frame
void Update () {
    
    }

IEnumerator ShowFPS()
    {
    
FPSTimer FPSTimer Time.deltaTime;
    
FPSCount++;
    if (
FPSTimer >= 1f) {FPSTimer 0FPSResult FPSCount;} 
    if (
showFPS == false) {yield return null;}
    }



burovalex 24.02.2013 10:13

Ответ: Фак по Юнити.
 
Опять же нарыл пример Пакса )
Разобрался немного, но суть всё равно до конца не понимаю... Но работает :-)


PHP код:

using UnityEngine;
using System.Collections;

public class 
Game MonoBehaviour {
    public 
bool showFPS
    public 
int FPSCountFPSResult;
    private 
float FPSTimer;
    
void Start () {
    if (
showFPS == true) {StartCoroutine(ShowFPS());}
    }

IEnumerator ShowFPS()
    {
    while (
showFPS)
        {
        
FPSTimer FPSTimer Time.deltaTime;
        
FPSCount++;
        if (
FPSTimer >= 1f) {FPSResult FPSCountFPSTimer 0FPSCount 0;} 
        yield return new 
WaitForSeconds(0.1f);
        }
    }



pax 24.02.2013 11:53

Ответ: Фак по Юнити.
 
Удали билд из папки ассетов, там их не должно быть. Никогда не делай билд в папку ассетов, в папку преокта можно, но не в Assets.

Корутина это функция, выполнение которой может прерываться на какое-то время, например до следующего кадра (yield return null), на определенное время (yield return new WaitForSeconds(0.1f)), до конца кадра (yield return new WaitForEndOfFrame()), до конца скачивания файла (смотри пример в классе WWW) и т.д.

burovalex 24.02.2013 18:43

Ответ: Фак по Юнити.
 
Хорошо что рано косяк произошел, теперь чаще буду экспортировать свои ассеты.

Ребят, подскажите. Мне надо обратиться к текстуре2д. Но когда я пытаюсь считать пиксель, компилятор говорит что текстура не читабельна (not readable), говорит изменить настройки импорта (умный собака ) ). Не нашёл такую настройку. Подскажите.

burovalex 24.02.2013 19:49

Ответ: Фак по Юнити.
 
Нашёл!!
Чтобы можно было манипулировать текстурой, надо выбрать текстуру, Texture Type выбрать Advanced, и поставить галочку Read/Write Enable.

burovalex 24.02.2013 21:40

Ответ: Фак по Юнити.
 
В импорте 3д моделей есть ньюанс, в 3д максе вертикальная ось Z, в юнити Y. При импорте модель расположена нормально (вертикально), НО при локальной трансформации вместо Y меняется Z.
К примеру:
PHP код:

processTimer += Time.deltaTime;
        
float scale Mathf.InverseLerp(0f,growInterval,processTimer);
        
transform.localScale = new Vector3(scale,scale*5,scale); 

Как можно решить такую задачу?
Может как то можно глобально менять масштаб? я не нашел

seaman 24.02.2013 23:01

Ответ: Фак по Юнити.
 
Цитата:

Как можно решить такую задачу?
Нормально экспортировать из Макса.
Почитай тут:
http://gamecreatingcommunity.ru/forum/59-5419-1

burovalex 25.02.2013 08:45

Ответ: Фак по Юнити.
 
Там написано просто повернуть пивот по оси Х на 90 градусов. Но таким образом ось Z будет направлена в противоположную сторону.
Ну да ладно, попробую сначала..

seaman 25.02.2013 09:30

Ответ: Фак по Юнити.
 
Цитата:

Но таким образом ось Z будет направлена в противоположную сторону.
С чего вдруг в противоположную? Z была "вверх" - станет "от тебя". Y была "на тебя", станет "вверх".

burovalex 25.02.2013 09:42

Ответ: Фак по Юнити.
 
Ты не прав, при экспорте твоя модель будет смотреть на тебя, а должна от тебя.

pax 25.02.2013 09:44

Ответ: Фак по Юнити.
 
А результат в Unity? И еще не видно в каких координатах ты работал в 3ds max...

burovalex 25.02.2013 10:08

Ответ: Фак по Юнити.
 
Вложений: 3
Пакс, оси в максе видно, они мелкие слева снизу.
Проверил локальную трансформацию объекта в юнити, всё работает правильно!

Вот правильный вариант
1) Повернуть пивот по оси Х на 90 градусов. (Affect Pivot Only)
2) Повернуть модель по оси Z на 180 градусов. (Affect Object Only)

burovalex 25.02.2013 17:12

Ответ: Фак по Юнити.
 
Вложений: 1
Каждый загруженный меш автоматически создает свой материал, как можно обратиться в скрипте к материалу в загруженном меше.

PHP код:

public class Example Mono..
{
public 
Mesh thisMesh;
void Start()
 {
 
Material thisMaterial thisMesh.????? ;
 }


А то у меня как то геморно получается. Есть префаб со скриптом, куда должны ложиться меши с материалами, и приходится создавать еще одни префабы где будут лежать меши с материалами.

Я вот про этот материал, в аттаче

pax 25.02.2013 18:03

Ответ: Фак по Юнити.
 
Меш не связан с материалом, материал определяет рендерер при визуализации меша который импортируется на тот же объект (gameObject.GetComponent<Renderer>.material)

У тебя там MeshRenderer и у него есть свиток Materials

burovalex 25.02.2013 18:24

Ответ: Фак по Юнити.
 
ЕССС! Работает! СПАСИБО ПАКС!!!

Только для обращения надо использовать MeshRenderer.sharedMaterials[0], чтобы материал с MeshRenderer не слетел.

PS. Твоя школа. :cool:
:-D

burovalex 25.02.2013 22:58

Ответ: Фак по Юнити.
 
Пакс, помнишь ты объяснил про MeshRenderer, с материалом разобрались. А как сам меш достать? не получается )

PHP код:

public class LOD MonoBehaviour {
    public 
MeshRenderer hiPolyPrefabmidPolyPrefablowPolyPrefab;
.....
//пробовал и так, и сяк
GetComponent<MeshFilter>().sharedMesh hiPolyPrefab;
GetComponent<MeshFilter>().sharedMesh hiPolyPrefab.GetComponent<MeshFilter>().sharedMesh

И всё не работает..

pax 25.02.2013 23:04

Ответ: Фак по Юнити.
 
Второй вариант должен работать...

burovalex 26.02.2013 09:18

Ответ: Фак по Юнити.
 

PHP код:

GetComponent<MeshFilter>().sharedMesh hiPolyPrefab.GetComponent<MeshFilter>().sharedMesh

MissingReferenceException: The variable hiPolyPrefab of 'LOD' doesn't exist anymore.
You probably need to reassign the hiPolyPrefab variable of the 'LOD' script in the inspector.
UnityEngine.Component.GetComponent[MeshFilter] () (at C:/BuildAgent/work/812c4f5049264fad/Runtime/ExportGenerated/Editor/UnityEngineComponent.cs:132)



Извиняюсь, я сначала в скрипте написал Mesh, объявил префабы, потом заменил Mesh на MeshRenderer, а переменные не переобъявил. Компиль был прав )

burovalex 05.03.2013 19:37

Ответ: Фак по Юнити.
 
Подскажите пожалуйста, мне нужен совет в реализации.
Есть динамически появляющиеся объекты, и мне надо чтобы игрок при взаимодействии с ними получал различные ресурсы, при условии что два разных дерева могут иметь один ресурс (древесина), и несколько ресурсов в одном объекте (например дерево имеет древесину и листву).

Помогите как лучше реализовать, своё имя, свой тэг, либо к объекту крепить скрипт с информацией о ресурсах.

pax 05.03.2013 20:09

Ответ: Фак по Юнити.
 
Как-то так:

PHP код:

using UnityEngine;

public class 
ResourcesContainer:MonoBehaviour
{
     public 
enum ResourceType{WoodLeavesStoneGoldetc}
     
     [
System.Serializable]
     public class 
ResourcesItem
     
{
           public 
ResourceType type;
           public 
int count;
     }

     public 
ResourcesItem[] resources;




burovalex 06.03.2013 15:14

Ответ: Фак по Юнити.
 
Спасибо Пакс! Было много вопросов, но решил на практике проверить и почти все отпали )

Получается System.Serializable задаётся для класса, и позволяет задавать значения в инспекторе для массивов этого класса?

И еще вопрос появился, для различных действий, с разными объектами такой же методой лучше пользоваться?
Разъясню, что я хочу сделать, допустим есть трава - её можно сорвать или срезать ножом, дерево - можно потрясти или срубить. Но и у разных деревьях должны быть разные характеристики, в зависимости от типа и размера.
Как думаете, подойдёт такой метод, допустим при нажатии кнопки, если у калайднутого объекта есть скрипт с набором действий, то проверять какое из существующих в нём действий выполнить.?

pax 06.03.2013 15:46

Ответ: Фак по Юнити.
 
Цитата:

Сообщение от burovalex (Сообщение 254288)
Получается System.Serializable задаётся для класса, и позволяет задавать значения в инспекторе для массивов этого класса?

Переменная/массив/список (List<MySerializableType>)

Цитата:

Сообщение от burovalex (Сообщение 254288)
И еще вопрос появился, для различных действий, с разными объектами такой же методой лучше пользоваться?
Разъясню, что я хочу сделать, допустим есть трава - её можно сорвать или срезать ножом, дерево - можно потрясти или срубить. Но и у разных деревьях должны быть разные характеристики, в зависимости от типа и размера.
Как думаете, подойдёт такой метод, допустим при нажатии кнопки, если у калайднутого объекта есть скрипт с набором действий, то проверять какое из существующих в нём действий выполнить.?

Я бы сделал так:
1. базовый скрипт с виртуальным(или абстрактным) методом действия
2. скрипты наследники с выполнением нужного действия в этом методе (override)
3. вешаешь ан каждый объект нужные скрипты
4. при столкновении получаешь базовый скрипт с объекта и вызываешь этот метод, который у всех будет работать по разному, но вызываться одинаково

это называется полиморфизм

burovalex 06.03.2013 22:00

Ответ: Фак по Юнити.
 
Спасибо Пакс, но мне пока что override не о чем не говорит, кроме перевод слова перезапись...

Рано походу мне до такого..

pax 06.03.2013 22:43

Ответ: Фак по Юнити.
 
Думаю это прояснит ситуацию немного: http://msdn.microsoft.com/ru-ru/library/ms173152.aspx
Ну и про наследование для общего развития http://msdn.microsoft.com/ru-ru/library/ms173149.aspx

Andvrok 07.03.2013 21:44

Ответ: Фак по Юнити.
 
Можно ли проверить, есть ли какой-либо геймобжект в определенной точке пространства? Если да, то пните меня в нужном направлении, пожалуйста.

Lestar 07.03.2013 22:22

Ответ: Фак по Юнити.
 
Если только так
Код:

GameObject[] goCollection =  FindObjectsOfType(typeof(GameObject)) as GameObjectt[];
for(int i=0; i<goCollection.Lenght; i++)
{
  if(goCollection[i].transform.position == foundPosition)
  {
    Debug.Log("Profit");
    break;
  }
}


seaman 07.03.2013 22:34

Ответ: Фак по Юнити.
 
Цитата:

про наследование для общего развития
Наследование "на пальцах".
Цитата:

Если да, то пните меня в нужном направлении, пожалуйста.
Physics.OverlapSphere

burovalex 12.03.2013 20:18

Ответ: Фак по Юнити.
 
Подскажите правильно ли я сделал..

У меня есть трава, которая растет пучками и с которым мне надо взаимодействовать по наведению на нее.
Решил использовать луч от центра экрана, но чтобы "колайднуть" траву, ей приходится создавать коллайдер, а чтобы игрок не врезался в траву - сделал её триггером.

Но чтото мне подсказывает что при условии что травы будет пару сотен к примеру - ничего хорошего для производительности это не приведёт - ведь проверки нахождения в триггере будут каждый кадр проверять на каждом пучке.

Прав ли я? И что лучше сделать?

pax 12.03.2013 21:46

Ответ: Фак по Юнити.
 
Есть слои и в настройках физики можно настраивать столкновение между слоями.
http://docs.unity3d.com/Documentatio...csManager.html

Стрелять по слою травы можно используя маску с нужным слоем.

burovalex 13.03.2013 10:07

Ответ: Фак по Юнити.
 
Спасибо Пакс, помог! Только у меня луч не хочет находить конкретный слой.
Распишу: создал новый слой "JustRayCast" в первой пользовательской ячейке (User Layer 8 ) , выбрал на паре примитивов этот слой, на других оставил Default. Когда начал кастить именно этот слой - ничего не выбирает, когда Default - все выбирает.
Хотя lay = 8..
Матрицу коллизий пока не трогал

PHP код:

using UnityEngine;
using System.Collections;

public class 
Look MonoBehaviour {
    
    public 
Ray ray;
    public 
RaycastHit hit;
    public 
Vector3 screenCenter;
    public 
int lay;
    public 
GameObject hitObject;
    public 
Vector3 hitedPosition;

    
void Start () {
    
screenCenter = new Vector3(Screen.width/2fScreen.height/2f0);
    
lay = (int)LayerMask.NameToLayer("JustRayCast");
    }
    
    
void Update () {
    
ray Camera.main.ScreenPointToRay(screenCenter);
        
    if (
Physics.Raycast(rayout hit5flay))
        {
        
hitObject hit.collider.gameObject;
        
hitedPosition hit.collider.transform.position;
        }
    }




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

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