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)

pax 02.04.2013 23:14

Ответ: Фак по Юнити.
 
Попробуй написать свой Editor скрипт для таких целей. Никто же не знает какие у тебя задачи ;)

burovalex 03.04.2013 11:15

Ответ: Фак по Юнити.
 
Ну задача у меня сделать труп типа рэгдола, но не для человека, а например для паука, у которого строение не похоже на человека.
Это надо кости джоинтами вручную соединять?

Цитата:

Попробуй написать свой Editor скрипт для таких целей.
Я пока не умею скрипты для редактора писать, но если есть хороший материал было бы не плохо для общего развития )

pax 03.04.2013 12:18

Ответ: Фак по Юнити.
 
У меня на вики есть три статьи по расширению редактора простейшие.
http://shgames.ru/

burovalex 03.04.2013 15:30

Ответ: Фак по Юнити.
 
Ну это немножко не то.
Чтобы создавать произвольный рэгдол надо чтото типа Tree генератора.
А у меня это в голове пока не укладывается.

burovalex 05.04.2013 21:46

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

У меня на скрине это префаб, в котором скрипт LOD меняет меш в зависимости от расстояния.
Пока это были меши, проблем не было. Но анимационный меш вместо простого не вставляется.

Какие ссылки мне надо ложить в скрипт? Может надо собрать какие то префабы?
Чтобы можно было положить скиновый меш в Mesh Renderer и добавить анимацию в Animations если она имеется.

И делал ли кто-нибудь так, чтобы 3д Максе было слеплено Две меши и привязаны к одним костям. А в юнити через одну анимацию анимировать один меш, а затем изменив на второй меш, продолжить проигрывать анимацию?

Это очень полезно для изменения детализации ncp (или npc, короче ботов).

И не могу найти как создать Skinned Mesh Rendered. (3-й скрин)

И не пойму зачем в импортированном скиновом меше 3 поля. (2-й скрин)
Одно сам меш, второе кости, а зачем еще и отдельно префаб со Skinned Mesh Renderer, не понимаю

pax 05.04.2013 22:42

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

seaman 05.04.2013 23:46

Ответ: Фак по Юнити.
 
Классика - анимация травы шейдером:
http://steps3d.narod.ru/tutorials/grass-tutorial.html
Для Юнити:
http://unity3d.ru/distribution/viewt...hp?f=35&t=1745
ЗЫ: Думаю в Юнити именно так и делается

burovalex 06.04.2013 08:17

Ответ: Фак по Юнити.
 
Спасибо за советы.
Ну ответьте на вопросы пожалуйста.
Мне всё равно надо учиться анимацией пользоваться..

pax 06.04.2013 12:21

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

1. MeshRenderer ничего не анимирует, костями анимирует SkinnedMeshRenderer. Animation анимирует дочерние объекты по иерархии и названиям. Чтобы работал SkinnedMeshRenderer, у него должны быть указаны свойства bones, sharedMesh. Меш должен иметь bindPoses и boneWeights.
2. Объект может иметь несколько дочерних SkinnedMeshRenderer'ов. Т.е. Animation двигает кости - все они будут анимированы. sharedMesh можно менять у одного SkinnedMeshRenderer'a, но вопрос по корректировке массива костей не помню.
3. Создавай кодом.
4. 1) Ассет меша, 2) иерархия костей, которыми управляет Animation, 3) Объект со SkinnedMeshRenderer, который визуализирует деформированный костями объект. Корневой объект содержит Animation, которым выполняется анимация костей.

burovalex 07.04.2013 21:39

Ответ: Фак по Юнити.
 
Решил попробовать использовать override.
Но чтото не получается, в справке покопался - такого не нашёл.

А хотел сделать так чтобы не проверять каждый раз условия в Update
Чтобы было не так
PHP код:

void Update()
{
if (
a==1) {...}
if (
a==2) {...}


А хотел сделать примерно так
PHP код:

void Start()
{
if (
a==1) {override void UpdateMetod(){...;} }
if (
a==2) {override void UpdateMetod(){...;} }
}

void Update()
{
UpdateMetod()


Я понял что override используется в классах. Посматрел на msdn доступный пример про Shapes.
Но может есть вариант решения моей задачи?

pax 07.04.2013 21:53

Ответ: Фак по Юнити.
 
То что ты хочешь сделать надо делать с помощью делегатов, например с системным делегатом Action
PHP код:

System.Action myUpdate;

void Start()
{
if (
a==1) {myUpdate =  Update1;}
if (
a==2) {myUpdate =  Update2;}
}

void Update();
{
myUpdate()
}  

void Update1()
{

}  

void Update2()
{



либо с помощью лямбда выражений
PHP код:

System.Action myUpdate;

void Start()
{
if (
a==1) {myUpdate =  ()=>{ ... }}
if (
a==2) {myUpdate =  ()=>{ ... }}
}

void Update()
{
myUpdate();



St_AnGer 09.04.2013 14:47

Ответ: Фак по Юнити.
 
Внезапно наткнулся на что то, что не могу понять и найти решение, хотя оно логически должно быть элементарным. Имею пулю, имею стены (на них висит компонент Level). У пули в событии OnCollisionEnter нужно узнать стену в которую попали и изменить у неё переменную health.

Пишу вот так:
Код:

    void OnCollisionEnter(Collision col)
    {
        string name = col.gameObject.name;

        if (name == "wall_1" || name == "wall_2")
        {
           
            Level wall = col.gameObject.GetComponent<Level>();

            if (wall)
                wall.health--;
           
        }

        Debug.Log("bullet collided with: "+name);
        m.FreeEntity(body, gameObject);
    }

условие if (wall), никогда не срабатывает, откуда логически следует, что я неправильно ищу нужный мне компонент на полученом при столкновении GameObject'ом. Если его убрать получаю много следующего мата от юнити:
Код:

NullReferenceException: Object reference not set to an instance of an object
Shot.OnCollisionEnter (UnityEngine.Collision col) (at Assets/Scripts/Shot.cs:49)

Само столкновение происходит прекрасно, в лог строка записывается, пуля удаляется. Переменная health у компонента Level является public-переменной.

Долго гуглил, но наверно я плохой гуглер, не нашёл решения. Не пойму, что я делаю не так?

pax 09.04.2013 14:49

Ответ: Фак по Юнити.
 
имхо у тебя компонент висит на руте стены, а попадаешь в какой-то чайлд. Попробуй так:
PHP код:

Level wall col.gameObject.transform.root.GetComponentInChildren<Level>(); 


St_AnGer 09.04.2013 14:53

Ответ: Фак по Юнити.
 
Заработало! Спасибо! :)

burovalex 24.04.2013 07:46

Ответ: Фак по Юнити.
 
Не могу понять что у меня за фигня с Юнити.
Скачиваю любой проект с Asset Store, а в импортированной сцене все компоненты сброшенные, т.е. с префабов сброшены скрипты, меши, у материалов сброшены текстуры.
Подумал проект корявый. Выкачал Robot Lab, Project Stealth и тд. везде одинаковая картина.

Причем удалил Юнити, подчистил реестр, переставил и нифига. Затона домашнем компе без проблем всё пашет
Началось такое походу после перехода на Unity 4.1.2

pax 24.04.2013 08:04

Ответ: Фак по Юнити.
 
Проект случаем не имеет русских букв в пути?

burovalex 24.04.2013 08:33

Ответ: Фак по Юнити.
 
Не, я русские вообще не использую

pax 24.04.2013 09:07

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

burovalex 24.04.2013 09:27

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

Не было такого?

jimon 24.04.2013 16:12

Ответ: Фак по Юнити.
 
как в этом вашем юнити нарисовать красивую прерывистую линию по кривой безье в 3д ? (типа как во флеше) готов заплатить до 50$, руками писать лень

pax 24.04.2013 16:16

Ответ: Фак по Юнити.
 
Есть такое http://starscenesoftware.com/vectrosity.html


У меня есть версия 2.1, сам не покупал, дали когда-то. И не пользовался)

Можно использовать LineRenderer и материал с тайлингом

burovalex 25.04.2013 22:30

Ответ: Фак по Юнити.
 
Доброго времени!
Решил потестить загрузку приложения из VK, через Яндекс.Диск
Но не получается, помогите разобраться.
  • Создал веб-проект в юнити.
  • Зарегил новое приложение в ВК.
  • Авторизовал приложение в Яндексе - вставил ссылку на приложение "http://vk.com/app3603323_4413506?ref=9" (Может надоhttp://vk.com/app3603323_4413506?? Ну в общем пока ни так, ни так не работает)
  • Залил оба файла проекта ForVK.unity3d ForVK.html
  • в ForVK.html поправил u.initPlugin(jQuery("#unityPlayer")[0], "http://yadi.sk/d/zuWFskOz4LgSk);" (сслыка на залитый ForVK.unity3d)
  • В VK, в настройках приложения выбрал IFrame, в http написал ссылку на файл http://yadi.sk/d/0qwj60nD4Lkts (Я понимаю что это не прямая ссылка, но вроде как Яндекс утверждает что можно получить данные http://api.yandex.ru/oauth/doc/dg/co...ion-scheme.xml Хотя я могу и ошибаться)

Ну в общем все манипуляции привели к надписи в ВК "This link was removed or not found."

Наверное я вообще не правильно понял смысл яндекса. Может загружать приложение надо с открытого хоста, а загруженное приложение через АПИ должно управлять файлами?

Ну собственно, вопросы: :)
Куда без заморочек можно залить проект?
Чтобы в ВК загрузить проект как ссылка будет выглядеть (чистый линк,или)?
Ну и если через АПИ ктото доставал данные, то приведите плиз пример запроса для приложения

pax 25.04.2013 23:12

Ответ: Фак по Юнити.
 
1. залить без заморочек можно на свой хостинг.
2. Чистый линк.
3. Вся документация по API тут http://vk.com/developers.php . Можно через Application.ExternalEval выполнять js прямо в странице. Собственно так и происходит обмен данными с js api. Есть вроде рабочий враппер http://unity3d.ru/distribution/viewt...hp?f=13&t=3894

И эта, приложение твое выключено.

burovalex 26.04.2013 17:49

Ответ: Фак по Юнити.
 
Вот нашёл такой вариант в инете - http://forum.uberstrike.com/discussi...-it-to-dropbox

Ну и что-то не проканало
Включил видимость. Но при загрузки теперь вообще ничего не выходит - пустое окно.

Правильно ли я заменил ссылку в html? И без вышесказанного врапера загружаться будет? (Красным строку пометил)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Unity Web Player | VK</title>
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'></script>
<script type="text/javascript">
<!--
var unityObjectUrl = "http://webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/UnityObject2.js";
if (document.location.protocol == 'https:')
unityObjectUrl = unityObjectUrl.replace("http://", "https://ssl-");
document.write('<script type="text\/javascript" src="' + unityObjectUrl + '"><\/script>');
-->
</script>
<script type="text/javascript">
<!--
var config = {
width: 960,
height: 600,
params: { enableDebugging:"0" }

};
var u = new UnityObject2(config);

jQuery(function() {

var $missingScreen = jQuery("#unityPlayer").find(".missing");
var $brokenScreen = jQuery("#unityPlayer").find(".broken");
$missingScreen.hide();
$brokenScreen.hide();

u.observeProgress(function (progress) {
switch(progress.pluginStatus) {
case "broken":
$brokenScreen.find("a").click(function (e) {
e.stopPropagation();
e.preventDefault();
u.installPlugin();
return false;
});
$brokenScreen.show();
break;
case "missing":
$missingScreen.find("a").click(function (e) {
e.stopPropagation();
e.preventDefault();
u.installPlugin();
return false;
});
$missingScreen.show();
break;
case "installed":
$missingScreen.remove();
break;
case "first":
break;
}
});
u.initPlugin(jQuery("#unityPlayer")[0], "https://www.dropbox.com/s/lhihalrl17vuyss/ForVK.unity3d");
});
-->
</script>
<style type="text/css">
<!--
body {
font-family: Helvetica, Verdana, Arial, sans-serif;
background-color: white;
color: black;
text-align: center;
}
a:link, a:visited {
color: #000;
}
a:active, a:hover {
color: #666;
}
p.header {
font-size: small;
}
p.header span {
font-weight: bold;
}
p.footer {
font-size: x-small;
}
div.content {
margin: auto;
width: 960px;
}
div.broken,
div.missing {
margin: auto;
position: relative;
top: 50%;
width: 193px;
}
div.broken a,
div.missing a {
height: 63px;
position: relative;
top: -31px;
}
div.broken img,
div.missing img {
border-width: 0px;
}
div.broken {
display: none;
}
div#unityPlayer {
cursor: default;
height: 600px;
width: 960px;
}
-->
</style>
</head>
<body>
<p class="header"><span>Unity Web Player | </span>VK</p>
<div class="content">
<div id="unityPlayer">
<div class="missing">
<a href="http://unity3d.com/webplayer/" title="Unity Web Player. Install now!">
<img alt="Unity Web Player. Install now!" src="http://webplayer.unity3d.com/installation/getunity.png" width="193" height="63" />
</a>
</div>
<div class="broken">
<a href="http://unity3d.com/webplayer/" title="Unity Web Player. Install now! Restart your browser after install.">
<img alt="Unity Web Player. Install now! Restart your browser after install." src="http://webplayer.unity3d.com/installation/getunityrestart.png" width="193" height="63" />
</a>
</div>
</div>
</div>
<p class="footer">&laquo; created with <a href="http://unity3d.com/unity/" title="Go to unity3d.com">Unity</a> &raquo;</p>
</body>
</html>

pax 26.04.2013 23:27

Ответ: Фак по Юнити.
 
C дропбокса с недавнего времени не отображаются html, если открыть
https://www.dropbox.com/s/b35ueey0gs1rhuv/ForVK.html
то страницу не видно, имхо в этом проблема

seaman 26.04.2013 23:56

Ответ: Фак по Юнити.
 
С html там сейчас вообще какая-то лажа. Проще всего завести бесплатный хостинг на который выкладывать файлы html в которых ссылка unty3d файлы выложенные на дропбокс. Вообще хостингов полно. Можете например по моей подписи.
Хотя многие советуют заливать на mail ru. Я не пробовал.
___________________________________
http://api.hostinger.ru/redir/1171666

pax 27.04.2013 00:00

Ответ: Фак по Юнити.
 
На майл ру хостинге приложений 29-го числа отключат эту возможность.

burovalex 27.04.2013 17:45

Ответ: Фак по Юнити.
 
Вы были правы, захостился на hostinger.ru.
Там оказалось действительно всё просто.
Начал разбираться и немного запутался.
Решил попробовать Photon Cloud. Но чтото не понимаю, если каждый загрузившийся - отдельный клиент.

То не понимаю, что, можно будет вообще без сервера работать?
И тогда что, каждый клиент сам будет делать проверки и иметь доступ к базам данных?
Мне кажется, или это действительно читерство будет плодит?

seaman 27.04.2013 19:50

Ответ: Фак по Юнити.
 
В клауде читерство значительно легче чем с отдельным сервером. Однако все же что-то можно сделать. Все равно нужно какой-то сервер для хранения пользователей, вложенных денег, достижений и т.п. Это может быть MySQL на обычном хостинге. Хотя при приличном числе пользователей, конечно, платном. Логин и все операции покупки/продажи/экипировки и т.п. делаем только на сервере в php скриптах и храним в том самом MySQL. Тем самым читерство будет только непосредственно в сражениях и т.п. При желании можно и там его слегка ограничить - время от времени посылать на SQL сервер в php скрипт запросы по проверке текущего оснащения и если не совпадает - банить.

burovalex 27.04.2013 21:02

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

Логин и все операции покупки/продажи/экипировки и т.п. делаем только на сервере в php скриптах и храним в том самом MySQL.
Ну я так и предполагал, чтобы хранить всё на sql.
А вот операции зачем хранить не понял. Я думал хранить только саму экипировку, деньги и т.п.

Просто я боюсь того, что клиент при подключении к базе может перехватить запрос sql. И натворить в этой базе всё что угодно (Или не сможет?)

А правильно ли я понял, что обращение к базе из приложения будет производиться через php-запросы, которые будут общаться с БД?

seaman 27.04.2013 22:54

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

А вот операции зачем хранить не понял.
В том смысле, что деньги на клиенте только для отображения - сколько их. А сама операция покупки, проверка хватает ли денег и т.п. - на сервере.
Цитата:

клиент при подключении к базе может перехватить запрос sql
Это как? Запрос делает php скрипт на сервере. Как клиент может его перехватить. Другое дело, что есть такая штука - инжекция в sql запрос. С ней можно "натворить в этой базе всё что угодно". Чтобы избежать,- нужно это предусматривать. Как - лучше спросить тут на форуме php. Там специалисты подскажут.

burovalex 28.04.2013 17:25

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

Не подскажите что можно сделать чтобы на одной машине тестить несколько игроков?

pax 28.04.2013 20:51

Ответ: Фак по Юнити.
 
На одном создать комнату, на втором в нее войти

burovalex 28.04.2013 21:34

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

Оказывается PhotonNetwork.PlayerList().Lenght не показывается сколько игроковв лобби, а показывает сколько в комнате

Исходник. Пинайте, очень нужно! (Я как садо-маза - больше пинков - приятнее)


PHP код:

using System;
using UnityEngine;
using System.Collections;

public class 
ConnectToMS Photon.MonoBehaviour {
    public 
string connectState "";
    public 
Rect connectStateRectlobbyPanelRect;
    public 
int countInRoom;

void Awake()
    {
    
PhotonNetwork.player.name "Player num-"+ (PhotonNetwork.playerList.Length).ToString();
    }
        
void Start () 
    {
    
PhotonNetwork.ConnectUsingSettings("v0.1");
    
countInRoom PhotonNetwork.playerList.Length;
    }
    

void OnConnectToMaster()
    {
    print (
"Client connected to Master Server");    
    }
    
    
void Update () 
    {
    
connectState PhotonNetwork.connectionStateDetailed.ToString();
    
connectStateRect = new Rect(5f,5f,connectState.Length*8f,21f);
    
lobbyPanelRect = new Rect(50f,50f,300f,400f);
    
countInRoom PhotonNetwork.playerList.Length;    
    }

void OnGUI()
    {
    
GUI.Label(connectStateRectconnectState); 
    
Rect tempRect = new Rect(150f,5f,100f,21f);
    
GUI.Label(tempRectPhotonNetwork.player.name);
    if (
PhotonNetwork.connectionStateDetailed == PeerState.JoinedLobby
        {
        
RoomInfo[] roomList PhotonNetwork.GetRoomList(); 
        
tempRect = new Rect(5f,30f,50f,21f);
        
GUI.Label(tempRectcountInRoom.ToString());    
        
GUILayout.BeginArea(lobbyPanelRect);
        for (
int roomNumber=0roomNumber<roomList.LengthroomNumber++)
            {
            
GUILayout.BeginHorizontal();
            
GUILayout.TextArea(roomList[roomNumber].name); 
            
GUILayout.TextArea(roomList[roomNumber].playerCount.ToString());
            
GUILayout.Button("Connect");
            
GUILayout.EndHorizontal();
            }
            
GUILayout.BeginHorizontal();
            if (
GUILayout.Button("Create a new room")) {CreateNewRoom();}
            
GUILayout.EndHorizontal();
        
GUILayout.EndArea();
        }
    }
    
void CreateNewRoom()
    {
    
    }



pax 28.04.2013 21:59

Ответ: Фак по Юнити.
 
PhotonNetwork.countOfPlayers - число игроков в сети
PhotonNetwork.countOfPlayersOnMaster - число игроков в лобби
PhotonNetwork.countOfRooms - число комнат

PhotonNetwork.playerList - список игроков в текущей комнате

burovalex 29.04.2013 16:46

Ответ: Фак по Юнити.
 
Помогите плиз. Опять упёрся. Не могу задать пользовательские настройки комнаты

Здесь я создаю комнату

PHP код:

void CreateNewRoom()
    {
    
string[] roomPropNames = new string[1];
    
roomPropNames[0] = "The map";
        
    
byte mapInRoom 5;
    
    
Hashtable roomProps = new Hashtable();
    
roomProps.Add((byte)mapInRoom);

    
PhotonNetwork.CreateRoom(("Room"truetrue12roomPropsroomPropNames);
    } 



Далее, поключившись к комнате пытаюсь посматреть этот параметр

PHP код:

void OnGUI()
    {
    
//ЕСЛИ В КОМНАТЕ
    
if (PhotonNetwork.connectionStateDetailed == PeerState.Joined)
        {
        
GUILayout.BeginArea(lobbyPanelRect);
        
GUILayout.Label("Map: "+PhotonNetwork.room.customProperties[0]); //Здесь считываю
        
GUILayout.EndArea();
        }
    } 



У меня вообще ничего не приходит - даже ноль.

pax 29.04.2013 16:56

Ответ: Фак по Юнити.
 
Я создаю комнату примерно вот так сейчас:
PHP код:

PhotonNetwork.CreateRoom(roomNametruetruelevelInfo.maxPlayers.Value,
                    new 
Hashtable 
                        
{
                            { 
"L"/* индекс выбранного уровня */ },
                            { 
"F"/* френдли фаер */ },
                            { 
"V"/* версия (хз зачем)) */},
                            { 
"MI"/* минимальный уровень игрока */},
                            { 
"MA"/* максимальный уровень игрока */},
                        },
                    new[]
                        {
                             
"L",
                             
"F",
                             
"V",
                             
"MI",
                             
"MA"
                        
}
                    ); 


burovalex 29.04.2013 17:09

Ответ: Фак по Юнити.
 
Всё равно не показывает. Значит значит создавал параметры правильно.
Может я не правильно их считываю?
PHP код:

GUILayout.Label("Map: "+PhotonNetwork.room.customProperties[0]);
        
GUILayout.Label("prop 1: "+PhotonNetwork.room.customProperties[1]);
        
GUILayout.Label("prop 2: "+PhotonNetwork.room.customProperties[2]); 


pax 29.04.2013 17:22

Ответ: Фак по Юнити.
 
Конечно не правильно, ключ байт, а ты считываешь int

burovalex 29.04.2013 18:03

Ответ: Фак по Юнити.
 
Спасибо большое Андрюх!
А в твоём варианте получается надо вызывать через string.

Для инета мне кажется не лучший вариант.
Может лучше описать enum

public enum roomProp {level, friendlyFire, version, minLevel, maxLevel}

А затем делать так:

PHP код:

PhotonNetwork.CreateRoom(roomNametruetruelevelInfo.maxPlayers.Value,
                    new 
Hashtable 
                        
{
                            { 
roomProp.level/* индекс выбранного уровня */ },
                            { 
roomProp.friendlyFire/* френдли фаер */ },
                            { 
roomProp.version/* версия (хз зачем)) */},
                            { 
roomProp.minLevel/* минимальный уровень игрока */},
                            { 
roomProp.maxLevel/* максимальный уровень игрока */},
                        },
                    new[]
                        {
                             
//а это я как понял описание параметров для лобби
                             
"индекс выбранного уровня",
                             
"френдли фаер",
                             
"версия (хз зачем))",
                             
"минимальный уровень игрока",
                             
"максимальный уровень игрока"
                        
}
                    ); 



и так же считывать
PHP код:

PhotonNetwork.room.customProperties[roomProp.level


pax 29.04.2013 18:06

Ответ: Фак по Юнити.
 
Когда займусь оптимизацией проекта - обязательно что-то сделаю с этим)

burovalex 29.04.2013 21:28

Ответ: Фак по Юнити.
 
Вложений: 1
Такой еще непонятный момент
в OnGUI выполняю вывод инфы о комнате
PHP код:

GUI.Label(connectStateRectconnectState);

    if (
PhotonNetwork.connectionStateDetailed == PeerState.Joined)
        {
        
GUILayout.Label(PhotonNetwork.room.name);
        
GUILayout.Label("Count of rooms: "+PhotonNetwork.countOfRooms);
        
GUILayout.Label("Players inside room: "+PhotonNetwork.countOfPlayersOnMaster);
        
GUILayout.Label("All players: "+PhotonNetwork.countOfPlayers);
...
...
...
...
        } 



А как видно по скрину - на мастере выполняется условие if (PhotonNetwork.connectionStateDetailed == PeerState.Joined)
А на втором клиенте не выполняется.

Хотя в самом верху отображено состояние у обоих Joined

pax 29.04.2013 21:41

Ответ: Фак по Юнити.
 
Не пользовался ни разу этим, зачем это вообще?) И кстати что в логе?

burovalex 30.04.2013 08:02

Ответ: Фак по Юнити.
 
Хм. А можно еще как-то проверить находится ли клиент в комнате?
А логи я пока не знаю где лежат, или их подключать надо?
Потому что в проекте его не нашел

burovalex 30.04.2013 09:14

Ответ: Фак по Юнити.
 
У меня не отбрабатывают собития фотона.
Пробую
void OnJoined()
void OnStatusChanged()
Реакции ноль!

подключил using Photon; - не помогло

Подскажите что надо подключить чтобы события отрабатывали

Как ты с ним вообще работаешь Пакс? Из документации нашел только пдф, в котором хрен что найдешь. На unity3d.ru по фотону вообще мёртвый раздел.
Как ты решаешь возникающие вопросы?

pax 30.04.2013 11:06

Ответ: Фак по Юнити.
 
Проверка нахождения в комнате:
PHP код:

PhotonNetwork.room != null 

По поводу сообщений... откуда ты такие события взял?

есть OnJoinedRoom, OnJoinedLobby и т.д.

PHP код:

/// <summary>
/// This enum makes up the set of MonoMessages sent by Photon Unity Networking.
/// Implement any of these constant names as method and it will be called
/// in the respective situation.
/// </summary>
/// <example>
/// Implement: 
/// public void OnLeftRoom() { //some work }
/// </example>
/// \ingroup publicApi
public enum PhotonNetworkingMessage
{
    
/// <summary>
    /// Called when the server is available and before client authenticates. Wait for the call to OnJoinedLobby (or OnConnectedToMaster) before the client does anything!
    /// Example: void OnConnectedToPhoton(){ ... }
    /// </summary>
    /// <remarks>This is not called for transitions from the masterserver to game servers, which is hidden for PUN users.</remarks>
    
OnConnectedToPhoton,

    
/// <summary>
    /// Called once the local user left a room.
    /// Example: void OnLeftRoom(){ ... }
    /// </summary>
    
OnLeftRoom,

    
/// <summary>
    /// Called -after- switching to a new MasterClient because the previous MC left the room (not when getting into a room). The last MC will already be removed at this time.
    /// Example: void OnMasterClientSwitched(PhotonPlayer newMasterClient){ ... }
    /// </summary>
    
OnMasterClientSwitched,

    
/// <summary>
    /// Called if a CreateRoom() call failed. Most likely because the room name is already in use.
    /// Example: void OnPhotonCreateRoomFailed(){ ... }
    /// </summary>
    
OnPhotonCreateRoomFailed,

    
/// <summary>
    /// Called if a JoinRoom() call failed. Most likely because the room does not exist or the room is full.
    /// Example: void OnPhotonJoinRoomFailed(){ ... }
    /// </summary>
    
OnPhotonJoinRoomFailed,

    
/// <summary>
    /// Called when CreateRoom finishes creating the room. After this, OnJoinedRoom will be called, too (no matter if creating one or joining).
    /// Example: void OnCreatedRoom(){ ... }
    /// </summary>
    /// <remarks>This implies the local client is the MasterClient.</remarks>
    
OnCreatedRoom,

    
/// <summary>
    /// Called on entering the Master Server's lobby. Client can create/join rooms but room list is not available until OnReceivedRoomListUpdate is called!
    /// Example: void OnJoinedLobby(){ ... }
    /// </summary>
    /// <remarks>
    /// Note: When PhotonNetwork.autoJoinLobby is false, OnConnectedToMaster will be called instead and the room list won't be available.
    /// While in the lobby, the roomlist is automatically updated in fixed intervals (which you can't modify).
    /// </remarks>
    
OnJoinedLobby,

    
/// <summary>
    /// Called after leaving the lobby.
    /// Example: void OnLeftLobby(){ ... }
    /// </summary>
    
OnLeftLobby,

    
/// <summary>
    /// Called after disconnecting from the Photon server. 
    /// In some cases, other events are sent before OnDisconnectedFromPhoton is called. Examples: OnConnectionFail and OnFailedToConnectToPhoton.
    /// Example: void OnDisconnectedFromPhoton(){ ... }
    /// </summary>
    
OnDisconnectedFromPhoton,

    
/// <summary>
    /// Called when something causes the connection to fail (after it was established), followed by a call to OnDisconnectedFromPhoton.
    /// If the server could not be reached in the first place, OnFailedToConnectToPhoton is called instead.
    /// The reason for the error is provided as StatusCode.
    /// Example: void OnConnectionFail(DisconnectCause cause){ ... }
    /// </summary>
    
OnConnectionFail,

    
/// <summary>
    /// Called if a connect call to the Photon server failed before the connection was established, followed by a call to OnDisconnectedFromPhoton.
    /// If the connection was established but then fails, OnConnectionFail is called.
    /// Example: void OnFailedToConnectToPhoton(DisconnectCause cause){ ... }
    /// </summary>
    
OnFailedToConnectToPhoton,

    
/// <summary>
    /// Called for any update of the room listing (no matter if "new" list or "update for known" list). Only called in the Lobby state (on master server).
    /// Example: void OnReceivedRoomListUpdate(){ ... }
    /// </summary>
    
OnReceivedRoomListUpdate,

    
/// <summary>
    /// Called when entering a room (by creating or joining it). Called on all clients (including the Master Client).
    /// Example: void OnJoinedRoom(){ ... }
    /// </summary>
    
OnJoinedRoom,

    
/// <summary>
    /// Called after a remote player connected to the room. This PhotonPlayer is already added to the playerlist at this time.
    /// Example: void OnPhotonPlayerConnected(PhotonPlayer newPlayer){ ... }
    /// </summary>
    
OnPhotonPlayerConnected,

    
/// <summary>
    /// Called after a remote player disconnected from the room. This PhotonPlayer is already removed from the playerlist at this time.
    /// Example: void OnPhotonPlayerDisconnected(PhotonPlayer otherPlayer){ ... }
    /// </summary>
    
OnPhotonPlayerDisconnected,

    
/// <summary>
    /// Called after a JoinRandom() call failed. Most likely all rooms are full or no rooms are available.
    /// Example: void OnPhotonRandomJoinFailed(){ ... }
    /// </summary>
    
OnPhotonRandomJoinFailed,

    
/// <summary>
    /// Called after the connection to the master is established and authenticated but only when PhotonNetwork.AutoJoinLobby is false.
    /// If AutoJoinLobby is false, the list of available rooms won't become available but you could join (random or by name) and create rooms anyways.
    /// Example: void OnConnectedToMaster(){ ... }
    /// </summary>
    
OnConnectedToMaster,

    
/// <summary>
    /// Called every network 'update' on MonoBehaviours that are being observed by a PhotonView.
    /// Example: void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info){ ... }
    /// </summary>
    
OnPhotonSerializeView,

    
/// <summary>
    /// Called on all scripts on a GameObject(and it's children) that have been spawned using PhotonNetwork.Instantiate
    /// Example: void OnPhotonInstantiate(PhotonMessageInfo info){ ... }
    /// </summary>
    
OnPhotonInstantiate,

    
/// <summary>
    /// Because the concurrent user limit was (temporarily) reached, this client is rejected by the server and disconnecting.
    /// </summary>
    /// <remarks>
    /// When this happens, the user might try again later. You can't create or join rooms in OnPhotonMaxCcuReached(), cause the client will be disconnecting.
    /// You can raise the CCU limits with a new license (when you host yourself) or extended subscription (when using the Photon Cloud).
    /// The Photon Cloud will mail you when the CCU limit was reached. This is also visible in the Dashboard (webpage).
    /// Example: void OnPhotonMaxCccuReached(){ ... }
    /// </remarks>
    
OnPhotonMaxCccuReached,
    
    
/// <summary>
    /// Called when inside a room when its custom properties have changed. This is ALSO called for room property changes by the local players.
    /// </summary>
    /// <remarks>
    /// Example: void OnPhotonCustomRoomPropertiesChanged(){ ... }
    /// </remarks>
    
OnPhotonCustomRoomPropertiesChanged,
    
    
/// <summary>
    /// Called when inside a room when a players custom properties change.
    /// </summary>
    /// <remarks>
    /// Example: void OnPhotonPlayerPropertiesChanged(PhotonPlayer player){ ... }
    /// </remarks>
    
OnPhotonPlayerPropertiesChanged




Работаю нормально, в pdf лазил по началу, сейчас исходники PUN смотрю когда что надо.

radiobutton 28.05.2013 04:14

Ответ: Фак по Юнити.
 
насколько я понял.
В юнити все вертится вокруг класса GameObject ?
Есть ли еще какие то такие очень важные классы ? =)
Возможно немного странный вопрос.


Посмотрел, в Юнити есть собственный класс Object. мм... what? xD


зы: не прошло и года, я решил опять изучить юнити +)

pax 28.05.2013 09:18

Ответ: Фак по Юнити.
 
Все объекты (ресурсы и объекты сцен) в Unity унаследованы от класса UnityEngine.Object

Вместе с GameObject неразрывно идет компонент Transform, который отвечает за трансформации объекта и за иерархию родитель/потомок. Еще очень важный класс MonoBehaviour - это базовый класс для всех пользовательских компонентов, которые можно вешать на GameObject.

radiobutton 28.05.2013 19:46

Ответ: Фак по Юнити.
 
[WrapperlessIcall ]
[MethodImpl]

А что делают эти атрибуты?

pax 28.05.2013 23:05

Ответ: Фак по Юнити.
 
Эти атрибуты указывают где реализация объектов/методов. В Unity эти атрибуты встречаются там, где имплементация выполнена не на C#, а на С++.

burovalex 09.06.2013 07:53

Ответ: Фак по Юнити.
 
Я тобой поражаюсь! Не видел вопроса на который бы ты не ответил..
Дай мозг погонять )

Я для себя сделал вывод, что я рано пытаюсь сделать нормальную игрульку.
И решил попробовать написать мелочёвку для Play Market'a.

Кто-нибудь писал что-нибудь под андроид? Много ли подводных камней?
Пока упёрся только в 25 баксов для регистрации под разрабом в гугле - пока денег нету, на вахте.
Часто ли надо тестить на самом андроиде? У меня его просто нету, но у знакомых могу брать иногда..
Сложно ли программировать тачпад?
И часто ли бывают косяки с совместимостью?

pax 09.06.2013 12:33

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

Из подводных камней - зоопарк разрешений экранов. Так что хотя бы в редакторе надо прогонять на всех разрешениях. По совместимости с Unity меньше проблем, чем писать непосредственно игру самому на Java или NDK. Так что тут можно не особо париться. Единственное Unity 4 поддерживает только arm7 и использовать лучше "кросплатформенные" форматы текстур типа ETC или не сжатые (RGB или ARGB ). Чем меньше альфы, тем меньше тормозит )

Так то из опыта всего одна игра - 21 на раздевание)

burovalex 09.06.2013 15:52

Ответ: Фак по Юнити.
 
Спасибо! Очень полезно. Значит надо девайс и как я понял Android Remote?
Ну с разрешением я на ПК подгонял и под 4:3 и 16:9. Складывал разрешения, делил на 2 и эту переменную брал за основу ,например, длины и высоты кнопки. Нормальный вариант?
Еще интересно, приложения изначально ориентированы на высоту или ширину?
Если мне надо ориентацию на ширину, надо боком всё ГУИ поворачивать?

pax 09.06.2013 18:12

Ответ: Фак по Юнити.
 
Вариант норм. Ориентацию можно задать в настройках билда заранее. Поворачивать ничего не надо.

burovalex 10.06.2013 15:38

Ответ: Фак по Юнити.
 
Начал разбираться с созданием профиля и хотел создавать файл на каждого профиля. Но подумал, Юнити может хранить данные, например, System.Serializable, он их хранит вне зависимости от состояния приложения. Стоит ли таким же методом хранить данные профилей?

Начал тестить и упёрся

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

public class Profile : MonoBehaviour {

[Serializable]
public class _Profile
{
public string name;
}
public static _Profile[] AllProfiles;
public static _Profile CurrentProfile;



void Update ()
{
AllProfiles = new _Profile[2];

}
}

В эдиторе забиваю данные, в одну ячейку, после Update появляется две ячейки но уже пустые. Я понимаю что происходит это из-за new. Но как подругому не знаю..

И после отключения приложения данные удаляются, можно ли их както сохранить?

И еще вопрос появился. При выделении TextField на андроиде автоматически появляется клава?

cahekp 11.06.2013 12:32

Ответ: Фак по Юнити.
 
to burovalex:
Эм, хм... Проблема.
1) System.Serializable не хранит данные вне зависимости от состояния приложения. Он позволяет выводить поля класса в окне Инспектора.
2) AllProfiles = new _Profile[2]; - это, в переводе на русский: "Создай две пустых ячейки типа _Profile и засунь их в AllProfiles". То есть, в методе Update ты просто постоянно перезаписываешь старый массив новым, но пустым.
3) Для записи используй PlayerPrefs.SetInt, PlayerPrefs.SetFloat, PlayerPrefs.SetString и т.д. Для чтения - GetInt, GetFloat и т.д. Это самый надежный способ записать данные кроссплатформенно, вне зависимости от операционной системы.

burovalex 27.06.2013 08:10

Ответ: Фак по Юнити.
 
Блин, я наверное опять где-то туплю...
SetInt SetFloat .. я так и не нашел.
Нашел Insert через него тоже Null Reference

Для полной картины выкидываю части кода (части чтоб в лишнем не копашиться)

Я использую несколько скриптов, один из них основной, который достаёт нужные переменные из остальных
основной скрипт

OnGUI ()
{
GUILayout.BeginHorizontal();
NewProfileName = GUILayout.TextField(NewProfileName, (int)20);
if (GUILayout.Button(DB.text.create))
{
Profile.AllProfiles[0].name.Insert(0,NewProfileName);
};
GUILayout.EndHorizontal();
}

скрипт профиля

public class Profile : MonoBehaviour {

[Serializable]
public class _Profile
{
public string name;
public int RAM, HDD, rankRAM, rankHDD;
public DateTime DateTimeBeginHDD;
}

public static _Profile[] AllProfiles;

void Start ()
{
AllProfiles = new _Profile[2];
}

cahekp 27.06.2013 11:33

Ответ: Фак по Юнити.
 
Причем тут Insert?
Insert - это вставить в строку какую-то подстроку с определенной позиции.
Вот это:
Profile.AllProfiles[0].name.Insert(0,NewProfileName);
всё-равно, что и вот это:
Profile.AllProfiles[0].name = NewProfileName;

Это никаким боком не относится к сохранению и загрузке!

Чтобы была возможность сохранять и загружать профили, пиши, грубо говоря, так:
Код:

public class Profile : MonoBehaviour {

[Serializable]
public class _Profile
{
public string name;
public int RAM, HDD, rankRAM, rankHDD;
public DateTime DateTimeBeginHDD;
}

public static _Profile[] AllProfiles;

void Start ()
{
AllProfiles = new _Profile[2];
}

public void Save() {
 PlayerPrefs.SetInt("CountProfiles", AllProfiles.Length);

 for (int i=0; i<AllProfiles.Length; i++) {
  PlayerPrefs.SetString(i+"_name", AllProfiles[i].name);
  PlayerPrefs.SetInt(i+"_RAM", AllProfiles[i].RAM);
  // И так далее по списку...
 }
}

public void Load() {
 AllProfiles = new _Profile[PlayerPrefs.GetInt("CountProfiles")];

 for (int i=0; i<AllProfiles.Length; i++) {
  AllProfiles[i].name = PlayerPrefs.GetString(i+"_name");
  AllProfiles[i].RAM = PlayerPrefs.GetInt(i+"_RAM");
  // И так далее по списку...
 }
}

После этого можешь использовать методы Load и Save для загрузки и сохранения состояний всех профилей одновременно.

burovalex 27.06.2013 16:05

Ответ: Фак по Юнити.
 
Вложений: 1
Мужики выручайте - скоро мозг взорвётся
Вроде ничего такого не делаю...

Вызываю в ГУИ фунцию (временно сделал не статикой, чтобы видеть что с данными):
PHP код:

GUILayout.BeginHorizontal();
            
NewProfileName GUILayout.TextField(NewProfileName, (int)20);
            if (
GUILayout.Button(DB.text.create)) 
                {
                
GetComponent<Profile>().CreateNewProfile (NewProfileName);
                };
        
GUILayout.EndHorizontal(); 

А вот в этом скрипте нулл хоть убейся:

PHP код:

using System.Collections.Generic;
using System;

public class 
Profile MonoBehaviour {
    
    [
System.Serializable]
    public class 
_Profile
        
{
        public 
string name;
        public 
int RAMHDDrankRAMrankHDD;
        public 
DateTime DateTimeBeginHDD;
        }
    
    public 
_Profile[] AllProfiles;
    public 
_Profile CurrentProfile;
    public 
int countProfiles;
    
void Start ()
    {

    }
    
void Update () 
    {

    }
    
public 
void CreateNewProfile (string NPN)
    {
    
countProfiles++;
    
AllProfiles = new _Profile[countProfiles];
        
    for (
int i=0i<countProfilesi++)
        {
        print (
i);
        
AllProfiles[i].name NPN;        
        }
    }



Хотя по скрину видно что в массиве Есть новый элемент! :wallbash:

seaman 27.06.2013 16:25

Ответ: Фак по Юнити.
 
AllProfiles[i] не определен. выделить память под массив - не значит определить все его элементы.

burovalex 27.06.2013 17:42

Ответ: Фак по Юнити.
 
СПАСИБО!
Я уже не первый раз так туплю. Пакс мне уже объяснял. Всё привыкнуть не могу. В старых языках один раз объявил и не перевыделишь уже память..

Т.е. получается AllProfiles[i] = new _Profile[10] - выделяет память под 10 элементов данного типа.
а AllProfile[1] - это уже определение?

seaman 27.06.2013 22:08

Ответ: Фак по Юнити.
 
AllProfile[1] = new _Profile();
Вот это определение.
Т.е. нужно пробежать циклом по всем элементам массива и определить их.
PS^ В Вашем случае было бы проще вместо
public class _Profile
использовать
public struct _Profile
если бы не нужна была сериализация. С одной стороны структуры по умолчанию определяются дефолтными значениями - не нужен цикл. С другой стороны структуры в Юнити не нормально сериализуются.

burovalex 27.06.2013 22:20

Ответ: Фак по Юнити.
 
Еще есть такой вопрос..

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

Вопросы:
Нормальный ли такой метод?
И главное, получится ли такой метод использовать в 2Д??

Т.е. нажал на кнопку и в этот момент скопировал текстуру кнопки с надписями рисунками координатами.

burovalex 28.06.2013 10:14

Ответ: Фак по Юнити.
 
Спасибо!
Когда я отвечал, ты как раз писал, не увидел ответа.
На счет структур вообще полезно. А сериализацией я не пользуюсь, даже не знаю для чего она. Просто с ней показывает массив в инспекторе :-)
А так вроде сериализация позволяет сохранять сцену, типа сохранения игры?


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

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