forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

WISHMASTER35 10.08.2012 15:17

Ответ: Вопросы от новичка
 
Код:

using UnityEngine;
using System.Collections;

public class CameraOrbit : MonoBehaviour {
       
        public Transform target;
        public Vector3 targetOffset = new Vector3(0, 1.5f, 0);
        private Vector3 oldTargetPosition;
       
        public float minAngleX = -20, maxAngleX = 60;
        private Vector3 angles;
       
        private const float minDistance = 1.0f;
        private float distance;
        public float maxDistance = 7.0f;
       
        public Vector3 cameraOffset = new Vector3(1, 0, 0);
       
        void OnEnable() {
                if( !target ) return;
                angles = transform.eulerAngles;
                distance = maxDistance;
        }
       
        void LateUpdate () {
                if( !target ) return;
               
                angles += GetInputRotation();
                angles.x = ClampAngle(angles.x, minAngleX, maxAngleX);
               
                Vector3 targetPosition = target.TransformPoint(targetOffset);
                // попытка сгладить движение камеры
                //targetPosition = Vector3.Lerp(oldTargetPosition, targetPosition, 15*Time.deltaTime);
                //oldTargetPosition = targetPosition;
               
                // сглаживаем вращение камеры
                Quaternion rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(angles), 20*Time.deltaTime);
                ComputeTransform(targetPosition, rotation, maxDistance, cameraOffset);
                distance = CollisionTest(targetPosition, distance);
        }
       
        private void ComputeTransform(Vector3 targetPosition, Quaternion rotation, float distance, Vector3 cameraOffset) {
                transform.rotation = rotation;
                transform.position = targetPosition;
                transform.Translate(0, 0, -distance);
                transform.Translate(cameraOffset * distance);
        }
       
        private float CollisionTest(Vector3 targetPosition, float oldDistance) {
                Vector3 dir = transform.position - targetPosition;
                float distance = Raycast(targetPosition, dir, dir.magnitude);
                if(distance < 1) distance = 1;
                distance = Mathf.Lerp(oldDistance, distance, 10*Time.deltaTime);
                transform.position = targetPosition + dir.normalized * distance;
                return distance;
        }
       
        private static float Raycast(Vector3 start, Vector3 dir, float distance) {
                RaycastHit hit = new RaycastHit();
                if( Physics.Raycast(start, dir, out hit, distance) ) {
                        return hit.distance;
                }
                return distance;
        }
       
        private static float ClampAngle(float angle, float min, float max) {
                if (angle < -360) angle += 360;
                if (angle > 360) angle -= 360;
                return Mathf.Clamp (angle, min, max);
        }
       
        private Vector3 GetInputRotation() {
                #if (UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR
                return MobileInput.GetRotation();
                #else
                if( !Input.GetMouseButton(1) ) return Vector2.zero;
                float dx = Input.GetAxis( "Mouse X" )*4;
                float dy = Input.GetAxis( "Mouse Y" )*4;
                return new Vector2(-dy, dx);
                #endif
        }
       
        void OnDrawGizmosSelected() {
                if(!enabled) return;
               
                Gizmos.color = Color.red;
                Gizmos.DrawSphere( target.TransformPoint( targetOffset ), 0.05f );
        }
       
}


pax 10.08.2012 15:23

Ответ: Вопросы от новичка
 
А что если
PHP код:

// попытка сгладить движение камеры
targetPosition Vector3.Lerp(oldTargetPositiontargetPosition15*Time.deltaTime);
 if((
targetPosition-oldTargetPosition ).magnitude <0.001f)
{
  
targetPosition oldTargetPosition ;
}
else
{
   
oldTargetPosition targetPosition;



WISHMASTER35 10.08.2012 21:55

Ответ: Вопросы от новичка
 
так же. в любом случае эоо,не решение, а затычка) а тебе не приходилось писать игры от третьего лица?
еще такой вопрос чешится) если я в апдейт активирую какой-то обьект, то можно после его отрисовки отключить без лишних переменных? т.е. перед апдейтом или после рендеринга каждый кадр отключать его?
пока у меня есть дополнительная переменная отвечающая за его состояние. и в LateUpdate я делаю
if !active then go.active = false;
active = false.
часто что-то надо включить на один кадр, а в следующем выключить. кумарит на такую мелочь тратить больше двух строк когда) может есть лучше способ решить это.

pax 10.08.2012 23:34

Ответ: Вопросы от новичка
 
Что-то мне не заметно как она дрыгается... попробуй так:
PHP код:

// попытка сгладить движение камеры
        
targetPosition Vector3.MoveTowards(oldTargetPositiontargetPosition15*Time.deltaTime);
        
oldTargetPosition targetPosition

А еще есть вот такая штука: Vector3.SmoothDamp

на счет остановки - есть возможность запустить корутину, которая дождется конца кадра и сделает дело - http://docs.unity3d.com/Documentatio...ndOfFrame.html.

WISHMASTER35 10.08.2012 23:59

Ответ: Вопросы от новичка
 
если бы понять почему при lerp дрожание происходит. теоретически камера просто должна немного отставать. но нет(.
за корутину и забыл, хотя я ее и не хотел использовать)

WISHMASTER35 12.08.2012 16:09

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

WISHMASTER35 15.08.2012 18:17

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

pax 15.08.2012 20:38

Ответ: Вопросы от новичка
 
попробовать в LateUpdate смещать объект на величину смещения лифта с прошлого кадра?

WISHMASTER35 15.08.2012 22:14

Ответ: Вопросы от новичка
 
вручную смещать то просто)
да и не очень хорошо смещать rigid body вручную.

pax 15.08.2012 22:33

Ответ: Вопросы от новичка
 
Попробуй двигать лифт в FixedUpdate и еще увеличить массу объекта.

WISHMASTER35 16.08.2012 00:26

Ответ: Вопросы от новичка
 
двигался он анимацией. достаточно было просто на лифт повесить rigid body)
кстати, не знаешь как в играх от третьего лица прицел игрока и камеры смотрит в одну точку? тут либо камера поворачивается туда куд попадает луч от прицела игрока. либо игрок поворачивается туда куда смотрит камера. но игрока поворачивать по моему не правильно. да и пучкать придется довольно длиный луч каждый кадр, что тоже не гуд.

pie 16.08.2012 00:34

Ответ: Вопросы от новичка
 
Вот тут есть на тему поворота камеры и прицела: Перейти на Unity3D.com

Данил 16.08.2012 03:19

Ответ: Вопросы от новичка
 
Цитата:

Пример:
using UnityEngine;

public class example : MonoBehaviour {
// объект, на который должен смотреть текущий объект
public Transform target;

// смотрим на цель всегда
void Update() {
transform.LookAt(target);
}
}
Цитата:

using UnityEngine;
using System.Collections;

public class Enemy : MonoBehaviour {
public int Health = 100;

public GameObject Player;
public Transform target2;

void Start () {
targer2 = GameObject.Find("Main Camera").GameObject;
}

void Update()
{
transform.LookAt(target2);
// хочу направить один объект на другой. что это за куча точек блеадь?
// что значит все эти постоянные "transoform"
// КАКИЕ тут блядь есть типы объектов?
// моя логика:
// раз тут у каждого объекта СВОЙ скрипт, то :
// this.rotation = pointToentity("Main camera");
//все блеадь. что тут еще надо? растолуйте мне эту логику!я в пятый ра пытаюсь сесть и заставить себя учить юанйт,
// но нигде нету нормального учебника по коду. толи я НАСТОЛЬКО привык к блицу, толи не понимаю я эту логику.
// расстолуйте.
}
}
Собственно, я на психе.

Например, все-таки направили один объект на другой.
Теперь задача - заставить его двигаться прямо. сначала заставим двигаться прямо по глобальным координатам. потом, в зависимости от собственного поворота. а теперь заставим рандомно двигаться - то влево, то вправо, то назад в зависимости от собственного поворота. при чем, как общего, так только и по горизонтальному направлению.
Напишите такие простые примеры - желательно, с комментариями, кому не лень.
Я в упор не могу понять эту систему.

Цитата:

// расчет поворота вокруг оси Y с учетом пройденноговремени с прошедшего кадра
Quaternion rotation = Quaternion.AngleAxis(RotationSpeed*Time.deltaTime, Vector3.up);

// применение вращения
transform.rotation *= rotation;
арр, что это.
что за Quaternion.AngleAxis? что за RotationSpeed*Time.deltaTime, Vector3.up?
Я, конечно, все понимаю, что тут написано. Но блин, где TurnEntity(0,0,1) ? И все?
Зачем столько сложностей?
Как это все тут устроено? Что за вектор3? Откуда такое большое постоянно количество точек?
Если для того, чтобы просто повернуть объект - я уже застопорился, то ...
Как тут написать, например, поиск пути в 3д пространстве? Например?
Блин, хочу тутор, начиная от синтаксиса, заканчивая этими банальными командами.

А то все туторы, что читал - только запутывают. pax, добавь в аську, я тебя немного по достаю. :)
И да, я не хочу лезть в дерби этих всех тем - наверняка, я такой не первый.

h1dd3n 16.08.2012 03:48

Ответ: Вопросы от новичка
 
transform.localEulerAngles += new Vector3(30.0f, 0.0f, 0.0f);
Вот для привычных градусов.

Но есть ограничения, лучше использовать кватернионы.

Надо повернуть объект направно (то есть вокруг оси Y, так как она напрваленна вверх) на 30 градусов:

Quaternion rightRotation = Quaternion.AngleAxis(30.0f, Vector3.up);
transform.rotation = transform.rotation * rightRotation;

Для создания сложных вращений кватернионы перемножаются. Порядок умножения имеет значение: в моем примере объект будет поворачиваться относительно локальной оси Y, если написать transform.rotation = rightRotation * transfrom.rotation, тогда объект будет поворачиваться относительно глобальной оси Y.

Цитата:

Что за вектор3? Откуда такое большое постоянно количество точек?
Какие еще точки? Это C#, не блитз. Vector3 - класс, описывающий 3д вектор. Векторы используются для обозначения позиции, скорости, ускорения, силы и т.д. Также в методе Quaternion.AngleAxis вектор используется для обозначения оси, вокруг которой производится вращение.
Цитата:

Теперь задача - заставить его двигаться прямо. сначала заставим двигаться прямо по глобальным координатам. потом, в зависимости от собственного поворота.
Курсоры (или WASD) вправо/влево - "двигаться прямо", вверх/вниз - "двигаться прямо учитывая собственное вращение"
Код:

using UnityEngine;

public class TestLookAt : MonoBehaviour
{
    public Transform TargetObject;

    void Start()
    {
       
    }
       
    void Update()
    {
        transform.LookAt(TargetObject);

        transform.position += transform.forward*Input.GetAxis("Vertical")*Time.deltaTime*30.0f;
        transform.position += Vector3.forward*Input.GetAxis("Horizontal")*Time.deltaTime*30.0f;
    }
}

"Сложности" созданы для удобства, как бы странно это не казалось.

pax 16.08.2012 14:31

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от Данил (Сообщение 236388)
pax, добавь в аську, я тебя немного по достаю. :)

Эм, ты у меня в контактах.

По порядку:
1. Каждый объект сцены имеет компонент Transform, который отвечает за ориентацию объекта в пространстве.
2. Получить компонент Transform в скрипте можно следующими способами:
  • просто свойство transform
  • тоже самое this.transform
  • GetComponent<Transform>()
3. Vector3 - это набор из трех координат (x,y,z). Используется для описания положения, направления или вращения (по каждой из осей).
4. Вектора можно складывать, вычитать:
PHP код:

Vector3 pos1 = new Vector3(1,2,3);
Vector3 pos2 = new Vector3(3,2,1);
Vector3 pos3 pos1 pos2// (4,4,4) 

5. В общем Vector3 этот вектор, который проходят в школе. Можно выполнять такие операции как скалярное произведение, векторное произведение, умножение вектора на число, длина вектора (расстояние между двумя точками можно определить как (pos2 - pos1).magnitude или Vector3.Distance(pos1,pos2))
6. Кватернионы это боле сложная структоура - комплексный вектор. О них просто надо думать как о вращении.
7. trnasform.rotation - вращение объекта заданное кватернионом.
8. transform.eulerAngles - вращение заданное вектором в градусах.
9. transform.position - глобальная позиция
10. transform.rotation - глобальное вращение
11. transform.localRotation - локальное вращение
12. transform.localEulerAngles - локальные углы поворота в градусах.
13. transfrom.localPosition - локальная позиция.
14. пользоваться углами Эйлера сложно, т.к. часто они не превышают 180 или 360 градусов и меняются.
15. пользоваться надо кватернионами.
16. Вращать объект так же можно через transform.Rotate()
17. Перемещать объект можно через transfrom.Translate()
18. 16 и 17 аналогичны блицевским командам и принимают последним параметром пространство (Space.Self или Space.World). Честно скажу, что ими не пользовался ни разу.
19. transfrom.localScale - масштаб объекта (обычно Vector3(1,1,1)).

pax 16.08.2012 15:12

Ответ: Вопросы от новичка
 
Кстати можешь для себя написать базовый класс, унаследованный от MonoBehaviour и в нем определить методы, которые тебе надо использовать без обращения к траносформу:

PHP код:

public class MyBehaviourMonoBehavoiur
{
   public 
void TranslateLocal(float xfloat yfloat z)
   {
       
transform.Translate(x,y,zSpace.Self);
   }

   public 
void TranslateGlobal(float xfloat yfloat z)
   {
       
transform.Translate(x,y,zSpace.World);
   }


Потом использовать:

PHP код:

public class MyScriptMyBehaviour
{
   public 
void Update()
   {
      
TranslateLocal(Time.deltaTime00);
   }


Кстати появилась мысль для блицеров такой класс написать, где собрать часть команд с теми же именами, что и на блице :)

Данил 16.08.2012 15:36

Ответ: Вопросы от новичка
 
о, это хорошая идея) модуль в юнайте )
transform.Translate(x,y,z, Space.Self);
о. что за спейс.селф :)
например, подставил х=1 - афигеть, теперь у меня кубик движется!!
подставил -1 -он куда-то резко улетел :(

pax 16.08.2012 15:47

Ответ: Вопросы от новичка
 
Self - локальные координаты.
Чтобы двигать с учетом времени, надо умножать на Time.deltaTime
transform.Translate(1 * Time.deltaTime, 0, 0, Space.Self);

Update вызывается каждый кадр.

RegIon 18.08.2012 16:24

Ответ: Вопросы от новичка
 
Как много морок с этим андроидом, пока управление сделаешь - повешаться можно.
Настрочил код, который крутит что нужно за пальцем:
PHP код:

v_old v_cur;
        
        
//пальчиком по кругу
        
if (ControlMode == && Input.touches.Length == 1) {
            
Touch touch Input.touches[0];
            if (
touch.phase == TouchPhase.Moved) {
                
v_cur touch.position v_center;
                if (
v_old != Vector2.zero)
                    
Game.alpha += Vector2.Angle (v_oldv_cur);//<--ТУТ
            
} else {
                
v_cur Vector2.zero;
            } 

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

Vector3 ass=Input.accelerometer;
ass.x=0;
 angle=Vector3.Angle(Vector3.up,ass);

не работает.
А всегда акселерометр возращяет десятичные доли?(.0,.2,.5 и т.д)

RegIon 19.08.2012 15:35

Ответ: Вопросы от новичка
 
УжЕ сам.ВСЕМ спасибо

WISHMASTER35 19.08.2012 21:36

Ответ: Вопросы от новичка
 
изучаю злых роботов. там все построенно на посылке сообщений с помощью SignalSender. вроде бы и удобно т.к. не надо создавать много скриптов, а один настраивать можно, чтобы при каких-то событиях он еосылал обьектам сообщения(например при взломе компа открывать двери и др) но пока разобрался что куда сообщения посылает пол дня прошло.
вот думаю как хорошо было бы, если в юнити был такой тип в который можно было записать ссылку на скрипт и метод. и конечно в инспекторе выводился бы список методов скрипта из которых можно было бы выбирать нужный. а то одну букву неправильно напишешь и ж@п@.
думаю это было бы и не сложно сделать, но создать свой инспектор для простого класса нельзя(
никому такая идея не приходила?

HolyDel 21.08.2012 11:09

Ответ: Вопросы от новичка
 
[зануда моде]
6. Кватернионы это боле сложная структоура - комплексный вектор гиперкомлексное число. О них просто надо думать как о вращении.
[/зануда моде]

Gector 21.08.2012 16:55

Ответ: Вопросы от новичка
 
Код передвижения кубиков по полу локации. Кубики двигаются только вместе. Когда нажатие всего одно ноль реакции.

Код:

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void Update()
        {
                Vector2 TPosition;
                Vector2 TPosition2;
               
                Ray ray = new Ray();
                Ray ray2 = new Ray();
               
                RaycastHit hit;
                RaycastHit hit2;
               
                GameObject cube;
                GameObject cube2;
                cube = GameObject.Find("Cube");
                cube2 = GameObject.Find("Cube2");
               
                TPosition = Input.GetTouch(0).position;
                TPosition2 = Input.GetTouch(1).position;
               
                ray = camera.ScreenPointToRay(TPosition);
                ray2 = camera.ScreenPointToRay(TPosition2);     
               
                Physics.Raycast(ray, out hit);
                if (hit.point != Vector3.zero){
                        cube.transform.position = hit.point;
                }
               
                Physics.Raycast(ray2, out hit2);
                if (hit2.point != Vector3.zero){
                        cube2.transform.position = hit2.point;
                }
        }
}


RegIon 21.08.2012 22:47

Ответ: Вопросы от новичка
 
я думаю из-за того, что происходит обрыв скрипта на стадии:
Код:

TPosition2 = Input.GetTouch(1).position;
, так как при одинарном тач, его не существует, перебирай
Код:

Input.touches
.
Gector, you все блитз забыть не можешь(те), паблик переменные не прикалывают?

...
Это прикол Unity что оно не вызывает OnCollision*** если ригид кинематический???

pax 22.08.2012 07:43

Цитата:

Сообщение от WISHMASTER35 (Сообщение 236707)
изучаю злых роботов. там все построенно на посылке сообщений с помощью SignalSender. вроде бы и удобно т.к. не надо создавать много скриптов, а один настраивать можно, чтобы при каких-то событиях он еосылал обьектам сообщения(например при взломе компа открывать двери и др) но пока разобрался что куда сообщения посылает пол дня прошло.
вот думаю как хорошо было бы, если в юнити был такой тип в который можно было записать ссылку на скрипт и метод. и конечно в инспекторе выводился бы список методов скрипта из которых можно было бы выбирать нужный. а то одну букву неправильно напишешь и ж@п@.
думаю это было бы и не сложно сделать, но создать свой инспектор для простого класса нельзя(
никому такая идея не приходила?

Так жеж это просто: obj.GetType().GetMethods()
где obj это скрипт.
Скрипт типа Component, имя метода - string. При старте получить метод по имени если надо вызывать через MethodInfo, если через мессаджи, то не надо. Делал много таких инспекторов в Antares Universe.


Цитата:

Сообщение от Gector (Сообщение 236841)

Код:

GameObject cube;
GameObject cube2;
cube = GameObject.Find("Cube");
cube2 = GameObject.Find("Cube2");


Лучше так не делать каждый кадр, ибо поиск по имени - сложная операция. Вынеси это в Start если кубы не заменяются новыми со временем.

Цитата:

Сообщение от Костян (Сообщение 236867)
Это прикол Unity что оно не вызывает OnCollision*** если ригид кинематический???

Если кинематический и сталкивается с коллайдером или другим кинематическим телом - вероятно да.

Gector 22.08.2012 17:57

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pax (Сообщение 236887)
Лучше так не делать каждый кадр, ибо поиск по имени - сложная операция. Вынеси это в Start если кубы не заменяются новыми со временем.

Моя забыть...:-)

pie 24.08.2012 18:38

Ответ: Вопросы от новичка
 
Добрый день. Решил сделать какую нибудь небольшую казуалку. Хотелось сделать все на GUI без лишних объектов. Возник вопрос по "тыку" по гемам. Как определить по какой текстурке ткнули мышкой?

WISHMASTER35 24.08.2012 22:06

Ответ: Вопросы от новичка
 
pie, проверяй попала ли мышь в rect твоей текстуры. вообще gui для этого не очень годится. хотч в 4й версии он уже навеоно батчится.
pax, вот именно что я не пойму как в инспекторе изменить поле, чтобы при нажатии на него было не редактирование строки, а выподал список методов скрипта. но как я понимаю такое не сделать. хотя еще можно было бы сделать, если можно было бы сделать инспектор не для скрипта, а для обычного класса. в данном случае класса SignalSender.

что вы за инспекторы в своей вселенной делаете? давно интересно было. можешь не очень тяжелый скрин сделать, а то инет мобильный.

pie 25.08.2012 01:23

Ответ: Вопросы от новичка
 
Спасибо. На wiki нашел шейдер Planet. Вроде бы все хорошо, но не хватает бампа. Не могли бы Вы помочь прикрутить бамп к этому шейдеру?

Код:

Shader "planets"
{
    Properties
    {
        _MainTex("Texture (RGB)", 2D) = "black" {}
        _Color("Color", Color) = (0, 0, 0, 1)
        _AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1)
        _Size("Size", Float) = 0.1
        _Falloff("Falloff", Float) = 5
        _FalloffPlanet("Falloff Planet", Float) = 5
        _Transparency("Transparency", Float) = 15
        _TransparencyPlanet("Transparency Planet", Float) = 1
    }
 
        SubShader
    {
        Pass
        {
            Name "PlanetBase"
            Tags {"LightMode" = "Always"}
            Cull Back
         
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
             
                #pragma fragmentoption ARB_fog_exp2
                #pragma fragmentoption ARB_precision_hint_fastest
             
                #include "UnityCG.cginc"
             
                uniform sampler2D _MainTex;
                uniform float4 _MainTex_ST;
                uniform float4 _Color;
                uniform float4 _AtmoColor;
                uniform float _FalloffPlanet;
                uniform float _TransparencyPlanet;
             
                struct v2f
                {
                    float4 pos : SV_POSITION;
                    float3 normal : TEXCOORD0;
                    float3 worldvertpos : TEXCOORD1;
                    float2 texcoord : TEXCOORD2;
                };

                v2f vert(appdata_base v)
                {
                    v2f o;
                 
                    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                    o.normal = v.normal;
                    o.worldvertpos = mul(_Object2World, v.vertex).xyz;
                    o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                 
                    return o;
                }
             
                float4 frag(v2f i) : COLOR
                {
                    i.normal = normalize(i.normal);
                    float3 viewdir = normalize(_WorldSpaceCameraPos-i.worldvertpos);
                 
                    float4 atmo = _AtmoColor;
                    atmo.a = pow(1.0-saturate(dot(viewdir, i.normal)), _FalloffPlanet);
                    atmo.a *= _TransparencyPlanet*_Color;
             
                    float4 color = tex2D(_MainTex, i.texcoord)*_Color;
                    color.rgb = lerp(color.rgb, atmo.rgb, atmo.a);
             
                    return color*dot(normalize(i.worldvertpos-_WorldSpaceLightPos0), i.normal);
                }
            ENDCG
        }
 
        Pass
        {
            Name "AtmosphereBase"
            Tags {"LightMode" = "Always"}
            Cull Front
            Blend SrcAlpha One
         
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
             
                #pragma fragmentoption ARB_fog_exp2
                #pragma fragmentoption ARB_precision_hint_fastest
             
                #include "UnityCG.cginc"
             
                uniform float4 _Color;
                uniform float4 _AtmoColor;
                uniform float _Size;
                uniform float _Falloff;
                uniform float _Transparency;
             
                struct v2f
                {
                    float4 pos : SV_POSITION;
                    float3 normal : TEXCOORD0;
                    float3 worldvertpos : TEXCOORD1;
                };

                v2f vert(appdata_base v)
                {
                    v2f o;
                 
                    v.vertex.xyz += v.normal*_Size;
                    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                    o.normal = v.normal;
                    o.worldvertpos = mul(_Object2World, v.vertex);
                 
                    return o;
                }
             
                float4 frag(v2f i) : COLOR
                {
                    i.normal = normalize(i.normal);
                    float3 viewdir = normalize(i.worldvertpos-_WorldSpaceCameraPos);
                 
                    float4 color = _AtmoColor;
                    color.a = pow(saturate(dot(viewdir, i.normal)), _Falloff);
                    color.a *= _Transparency*_Color*dot(normalize(i.worldvertpos-_WorldSpaceLightPos0), i.normal);
                    return color;
                }
            ENDCG
        }
    }
 
    FallBack "Diffuse"
}


pie 25.08.2012 11:05

Ответ: Вопросы от новичка
 
Вложений: 3
И еще один вопрос. Вот скрипт: http://pastebin.com/ym0jxeHx.
Вроде все правильно. В первый раз местами кубы меняются. А при попытке снова поменять местами кубы выскакивает ошибка якобы я удалил нужный объект и его нет, но на самом деле он есть. (MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.)

Ругается на строчку GameObject gem = (GameObject)Instantiate(grid[i, j]);

Radnk 25.08.2012 16:42

Ответ: Вопросы от новичка
 
Что лучше одна большая модель или много маленьких?

WISHMASTER35 25.08.2012 18:15

Ответ: Вопросы от новичка
 
много моделей - много дравколлов. хотя совсем мелкие модели сбатчатся, если материал один. но на это тоже время уйдет.

pie 25.08.2012 18:35

Ответ: Вопросы от новичка
 
Вложений: 1
Кто нить сможет помочь с моей проблемой?

pax 25.08.2012 22:12

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от WISHMASTER35 (Сообщение 237155)
pax, вот именно что я не пойму как в инспекторе изменить поле, чтобы при нажатии на него было не редактирование строки, а выподал список методов скрипта. но как я понимаю такое не сделать.

Элементарно:
PHP код:

using UnityEngine;

public class 
MethodsExample MonoBehaviour
{
    public 
string messageName "";

    
void Start()
    {

    }

    
void Update()
    {

    }


PHP код:

using System.Reflection;
using UnityEditor;
using UnityEngine;

[
CustomEditor(typeof(MethodsExample))]
public class 
MethodsExampleEditor Editor
{
    public 
override void OnInspectorGUI()
    {
        var 
obj = (MethodsExampletarget;

        
GUILayout.BeginHorizontal();
        
GUILayout.Label("Message");
        if (
GUILayout.Button(obj.messageName??""GUI.skin.textField))
        {
            var 
menu = new GenericMenu();

            foreach (var 
methodInfo in typeof(MethodsExample).GetMethods(
                
BindingFlags.Instance BindingFlags.Public | BindingFlags.NonPublic BindingFlags.DeclaredOnly))
            {
                var 
methodName methodInfo.Name;
                
menu.AddItem(new GUIContent(methodName), false, () => obj.messageName methodName);
            }

            
menu.ShowAsContext();
        }
        
GUILayout.EndHorizontal();
    }



cahekp 26.08.2012 17:16

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pie (Сообщение 237226)
Кто нить сможет помочь с моей проблемой?

А в чем, собственно, проблема?

Кольца должны всегда быть перпендикулярны камере?

pax 26.08.2012 20:04

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от cahekp (Сообщение 237318)
А в чем, собственно, проблема?

Проблема решена по аське.

WISHMASTER35 29.08.2012 17:50

Ответ: Вопросы от новичка
 
pax, вот будят у меня куча скриптов, которые посылают по несколько сообщений. мне тогда для каждого скрипта делать Editor?
Код:

[System.Serializable]
public class SignalSender {
       
        public bool onlyOnce;
        public ReceiverItem[] receivers;
        private bool hasFired = false;

       
        public void SendSignals(MonoBehaviour sender) {
                if (hasFired == false || onlyOnce == false) {
                        foreach(ReceiverItem receiver in receivers) {
                                receiver.Send(sender);
                        }
                        hasFired = true;
                }
        }
       
}

[System.Serializable]
public class ReceiverItem {
        public GameObject receiver;
        public string action = "OnSignal";
       
        public void Send(MonoBehaviour sender) {
                if (receiver)
                        receiver.SendMessage(action);
                else
                        Debug.LogWarning("No receiver of signal \""+action+"\" on object "+sender.name+" ("+sender.GetType().Name+")", sender);
        }
}

Вот если бы для этого ReceiverItem сделать Editor, то можно было бы во всех скриптах использовать SignalSender и не делать больше Editor'ов.

pax 29.08.2012 18:05

Ответ: Вопросы от новичка
 
Ты говорил про невозможность, я тебе показал что это возможно. Лень скрипты (эдиторы) писать? Так и скажи.

WISHMASTER35 29.08.2012 19:42

Ответ: Вопросы от новичка
 
Как создать инспектор для одного скрипта я знаю. Я имел ввиду как изменить поле для своего типа во всех скриптах. Либо изменить инспектор для простого класса как тот ReceiverItem.
Если бы твой пример изменял дефолтный инспектор для ВСЕХ скриптов, то еще было бы нормально.

Цитата:

Лень скрипты (эдиторы) писать? Так и скажи.
Если таких скриптов будет больше, чем пальцев на руку, то у меня конечно мало желания писать еще для каждого Editor'ы, а эти редакторы еще настраивать\перенастраивать при добавлении\удалении такого string messageName.
Я хотел более\менее универсальный способ.
кстати, впервые вижу такие конструкции
Цитата:

obj.messageName??""
Цитата:

() => obj.messageName = methodName

pax 29.08.2012 20:56

Ответ: Вопросы от новичка
 
Одни противоречия

Цитата:

Сообщение от WISHMASTER35 (Сообщение 237155)
pax, вот именно что я не пойму как в инспекторе изменить поле, чтобы при нажатии на него было не редактирование строки, а выподал список методов скрипта. но как я понимаю такое не сделать.

Я тебе дал ответ, теперь ты пишешь что это знаешь

Цитата:

Сообщение от WISHMASTER35 (Сообщение 237521)
Как создать инспектор для одного скрипта я знаю.

конечно, я же дал ответ. Ты уш определись и задавай вопросы конкретнее.

Цитата:

Сообщение от WISHMASTER35 (Сообщение 237521)
Я имел ввиду как изменить поле для своего типа во всех скриптах. Либо изменить инспектор для простого класса как тот ReceiverItem.
Если бы твой пример изменял дефолтный инспектор для ВСЕХ скриптов, то еще было бы нормально.

Если таких скриптов будет больше, чем пальцев на руку, то у меня конечно мало желания писать еще для каждого Editor'ы, а эти редакторы еще настраивать\перенастраивать при добавлении\удалении такого string messageName.
Я хотел более\менее универсальный способ.

Для сериализуемых классов, которые используются как значения - нельзя инспекторы писать.

Цитата:

Сообщение от WISHMASTER35 (Сообщение 237521)
кстати, впервые вижу такие конструкции

Оператор дефолтного значения (правая часть подставляется, когда левая null) и Лямбда выражение.

WISHMASTER35 29.08.2012 21:39

Ответ: Вопросы от новичка
 
Цитата:

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

pax 30.08.2012 12:35

Ответ: Вопросы от новичка
 
В четверке появились класс PropertyDrawer и атрибут CustomPropertyDrawer для этих целей. А так же PropertyAttribute для модификации отображения конкретных свойств, например задать Range для чисел.

is.SarCasm 04.09.2012 22:44

Ответ: Вопросы от новичка
 
Как сделать размытие при повороте камеры? (Blur, похоже, никуда не годится)

pax 04.09.2012 23:15

Ответ: Вопросы от новичка
 
например за денюшку http://u3d.as/content/insidious-tech...otion-blur/3hT

den 04.09.2012 23:21

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

is.SarCasm 04.09.2012 23:52

Ответ: Вопросы от новичка
 
Цитата:

а лучше не делать. я знаю целых ноль игр где это уместно.
Мне во всех нравится. Это не такой заметный эффект, но приятно.

WISHMASTER35 09.09.2012 19:54

Ответ: Вопросы от новичка
 
pax, ты мне когда-то давал пример как рисовать с правой стороны экрана.
Код:

GUILayout.BeginArea(new Rect(0, 0, Screen.width, Screen.height));
GUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        GUILayout.Label("Label");
GUILayout.EndHorizontal();
GUILayout.EndArea();

Так я и не могу понять как BeginArea(new Rect(0, 0, Screen.width, Screen.height)) тут работает.
Ведь (0, 0, Screen.width, Screen.height) это и так дефолтные координаты экрана.

pax 09.09.2012 22:49

Ответ: Вопросы от новичка
 
Area это Vertical в заданном ректе. Вертикал начинается с верху этой области. Горизонтал в первой строке прижимает метку к правой части строки с использованием резинового пространства.

WISHMASTER35 18.09.2012 20:07

Ответ: Вопросы от новичка
 
А возможно в окне Game рисовать из Editor и отслеживать события мыши?

pax 18.09.2012 21:12

Ответ: Вопросы от новичка
 
В Game на врядли, в SceneView можно.

WISHMASTER35 18.09.2012 21:26

Ответ: Вопросы от новичка
 
Плохо. Я хотел сделать небольшой редактор gui, чтобы можно было трансформировать gui визуально.
И еще, нельзя сделать, чтобы GUILayout растягивал элементы на 1/n от ширины или высоты области рисования сохраняя пропорции? Или он только позиции вычисляет?
Сейчас я кнопку сделал в отдельном классе и там вручную вычисляю позицию и размер
Код:

float x = this.x * Screen.width / 100f + transform.position.x;
float y = this.y * Screen.height / 100f + transform.position.y;
               
float aspect = (float) texture.width / texture.height;
float scale = Screen.height;
float w = transform.lossyScale.x * scale * this.scale / 100f * aspect;
float h = transform.lossyScale.y * scale * this.scale / 100f;
               
Vector2 offset = GetOffset(anchor);
x -= offset.x * w;
y -= offset.y * h;
return new Rect(x, y, w, h);

Думаю может можно проще это делать.
Надо сделать GUI, чтобы нормально выглядел на разных экранах.

pax 18.09.2012 23:58

Ответ: Вопросы от новичка
 
есть реализация редактирования GUI через хэндлы http://code.google.com/p/bitverse-unity-gui/

RegIon 22.09.2012 18:58

Ответ: Вопросы от новичка
 
PHP код:

if(Input.touchCount==0)
                
DDMove.LR=0;
            
            foreach(
Touch touch in Input.touches)
            {
                if(
touch.position.x>Screen.width/2.0)
                        
DDMove.LR=1f;
                    else
                        
DDMove.LR=-1f;
                
                if(
Input.touchCount>1)
                {
                    
DDMove.Jump=true;
                
                }                
            } 

Кроме прыжка ничего больше не работает, че за хрень?

pax 22.09.2012 23:22

Ответ: Вопросы от новичка
 
странное управление, а полностью весь скрипт и к нему прилагающийся (DDMove) можно?

pie 29.09.2012 14:05

Ответ: Вопросы от новичка
 
Всем привет. От делать нечего решил сделать небольшую игру типа Сапер. За сегодня сделал вот это: Онлайн
То есть расстановка всего необходимого. Белые кубы - мины. Не нравится мне только одно - расстановка этих самых мин. Расставляю я их так:
Код:

for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
                int rnd = Random.Range(0, 9);
                if (numberMines > 0) {
                        gameMinesArray[rnd, j] = true;
                        numberMines--;
                }
        }
}

Здесь:
gameMinesArray - массив где указывается расположение мин на игровом поле;
numberMines - максимальное кол-во мин на игровом поле;

Что посоветуете Вы?

pax 29.09.2012 21:16

Ответ: Вопросы от новичка
 
Можно как-то так:
PHP код:

while(numberMines>0)
{
 
int i Random.Range(09);
 
int j Random.Range(09);
 if(!
gameMinesArray[ij])
 {
    
gameMinesArray[ij] = true;
    
numberMines--;
 }



Okay 29.09.2012 21:29

Ответ: Вопросы от новичка
 
Как сделать структуру PlayerInfo
Допустим при заходе на сервер, игроку должно выдавать нулевые значения
типа PlayerInfo[player][Health] = 0;
В массиве находится "player", вот как раз это функция и нужна. Я не знаю, есть она в unity или нет. Как бы идет обращение к определенному игроку.

pax 30.09.2012 11:24

Ответ: Вопросы от новичка
 
Поясни более подробно что ты хочешь. Предугадывать не очень прикольно.
PHP код:

Dictionary<string,Dictionary<string,object>> PlayerInfo  = new Dictionary<string,Dictionary<string,object>>();

void Start()
{
    
PlayerInfo ["player"] = new Dictionary<string,object>();
    
PlayerInfo ["player"]["Health"] = 0;



Okay 30.09.2012 16:10

Ответ: Вопросы от новичка
 
Цитата:

Поясни более подробно что ты хочешь. Предугадывать не очень прикольно.
Смотри у каждого игрока есть свои значения.
типа
Код:

enum Info
{
    Name,
    Password,
    Health,
    Armour,
    Money,
    Gun
};
char PlayerInfo[MAX_PLAYERS][Info];


pie 30.09.2012 16:25

Ответ: Вопросы от новичка
 
Кому не лень тестируем "Сапер":
Играть онлайн

WISHMASTER35 30.09.2012 16:35

Ответ: Вопросы от новичка
 
Что-то туплю с системой частиц.
Если каждый кадр вызывать метод Emit(), то создается огромная куча частиц. Можно как-то ограничить максимальное количество частиц?
Делаю выстрел т.е. должно стрелять равномерно, но не таким огромным количеством частиц.

Okay 30.09.2012 17:47

Ответ: Вопросы от новичка
 
Ну почти)

pie 30.09.2012 23:40

Ответ: Вопросы от новичка
 
Небольшие косметические обновления. Можно ставить флажки и вопросительные знаки. Ссылка та же. Посоветуйте что еще сделать что-бы было красиво и интересно играть.

pax 01.10.2012 08:01

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pie (Сообщение 239466)
Посоветуйте что еще сделать что-бы было красиво и интересно играть.

отключи меню по правкой кнопке


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

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