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)

Lestar 22.10.2012 15:05

Ответ: Вопросы от новичка
 
Можно было и из ресурсов ГО загрузить.

St_AnGer 24.10.2012 20:22

Ответ: Вопросы от новичка
 
Имею два класса(файла скрипта):
main.cs :
Код:

using UnityEngine;
using System.Collections;

public class main : MonoBehaviour {

        // Use this for initialization
    public player[] pl = new player[2];

    public void Position(GameObject go, float x, float y, float z){go.transform.position = new Vector3(x, y, z);}
    public void Move(GameObject go, float x, float y, float z){go.transform.Translate(x, y, z);}

        void Start () {
        Camera cam = new GameObject("cam").AddComponent<Camera>();
        cam.transform.position = new Vector3(0, 0, -5);

        pl[0] = new GameObject("player1").AddComponent<player>();
        pl[0].CreatePlayer(0, 0, "asd");
        }
       
        // Update is called once per frame
        void Update () {

        }
}



player.cs :
Код:

using UnityEngine;
using System.Collections;

public class player : MonoBehaviour
{
    public main m;
    void Awake() { m = GetComponent<main>(); }

    public GameObject body, turret;
    public string name;

        void Start ()
    {
        }

    public void CreatePlayer(int x, int z, string type)
    {
        body = GameObject.CreatePrimitive(PrimitiveType.Cube);
        body.name = "body";
        body.transform.parent = gameObject.transform;
        m.Position(body, 0, -1.0f, 0);
        body.transform.position = new Vector3(x, 0, z);
        body.transform.localScale = new Vector3(1, 0.5f, 1);
   
        turret = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        turret.name = "turret";
        turret.transform.position = new Vector3(x, 0.5f, z);
        turret.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
        turret.transform.parent = body.transform;
   
        name = type;
    }
       
    void Update()
    {
        if (m)
        {
            if (Input.GetKey(KeyCode.LeftArrow))
                m.Move(body, -0.1f, 0, 0);
            else if (Input.GetKey(KeyCode.RightArrow))
                m.Move(body, 0.1f, 0, 0);
        }
        }
}



ну соответственно в сцене имею main (GameObject на котором висит main.cs). В результате при запуске имею следующую ошибку:
Код:

NullReferenceException: Object reference not set to an instance of an object
player.CreatePlayer (Int32 x, Int32 z, System.String type) (at Assets/player.cs:21)
main.Start () (at Assets/main.cs:17)

Двойной клик по ошибке отправляет в файо player.cs на строку:
Код:

        m.Position(body, 0, -1.0f, 0);
вопрос1 - почему?
вопрос2 - как исправить?

Можно конечно просто писать body.transform.position... и т.д., тогда всё как надо работает. Но хочется как то упростить себе жизнь, подготовив основные функции для работы с движением/позицией/ротацией и т.д. (отходить от блица конечно надо скорее, но пока хочется печатать поменьше, точнее написать один раз много и потом писать по малу). Или надо эти мои общие функции писать не в классе main, а где то в другом месте?



UPD
решено:
добавил отдельный скрипт functions.cs
Код:

using UnityEngine;
using System.Collections;

public class functions : MonoBehaviour
{
    public void Position(GameObject go, float x, float y, float z) { go.transform.position = new Vector3(x, y, z); }
    public void Move(GameObject go, float x, float y, float z) { go.transform.Translate(x, y, z); }
}



и в нужных скриптах прописал
PHP код:

private functions m;
    
void Awake() {gameObject.AddComponent<functions>(); } 

ну и далее m.Move...

наверное тоже очень некорректно, но работает.

pie 25.10.2012 11:04

Ответ: Вопросы от новичка
 
Кто работал с VK.Api помогите. Размещаю на стене пользователя запись. Для того чтобы сообщение было видно делаю размер игрового окна 1x1. Как мне вернуть первоначальное значение после размещения записи на стене?
VK.callMethod("resizeWindow", 1, 1);
VK.api('wall.post', {message: "текс"});

pax 25.10.2012 14:28

Ответ: Вопросы от новичка
 
Думаю так у тебя заработает:
PHP код:

void Awake() { main = (main)FindObjectOfType(typeof(main)); } 


St_AnGer 25.10.2012 14:30

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

Сообщение от pax (Сообщение 241085)
Думаю так у тебя заработает:
PHP код:

void Awake() { main = (main)FindObjectOfType(typeof(main)); } 


Пост свой уже удалил, т.к. дошёл до этого на минуту раньше чем получил ответ. Но всё равно спасибо! Тем более, что этот же ответ подойдёт и в предыдущий мой пост. Только там я проблему решил очень корявым способом, сейчас заодно и исправлю.
Вообще заметил за собой такую вещь в большинстве случаев - думаю над чем то, думаю, никак не додумаюсь. Только спрошу на форуме как сделать то, над чем думал - сразу сам до решения дохожу. Волшебство Булочки, не иначе! :)

pax 25.10.2012 14:55

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

Сообщение от St_AnGer (Сообщение 241086)
Вообще заметил за собой такую вещь в большинстве случаев - думаю над чем то, думаю, никак не додумаюсь. Только спрошу на форуме как сделать то, над чем думал - сразу сам до решения дохожу. Волшебство Булочки, не иначе! :)

Нет это закономерно, потому что правильно задав вопрос ты уже на половину знаешь ответ ;)

Okay 27.10.2012 15:34

Ответ: Вопросы от новичка
 
Как убрать слайдинг в стандартном Input Platform Controller?
визуально не получается. Слайдинг все равно есть. Что не есть хорошо

WISHMASTER35 27.10.2012 18:58

Ответ: Вопросы от новичка
 
Кто-нибудь знает, если в Surface шейдере задать параметр noambient, т.е. выключить окружающий свет, то как сделать финальный цвет не черный?

pax 27.10.2012 19:14

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

Сообщение от WISHMASTER35 (Сообщение 241292)
Кто-нибудь знает, если в Surface шейдере задать параметр noambient, т.е. выключить окружающий свет, то как сделать финальный цвет не черный?

Пример хоть шейдера покажи

ARA 27.10.2012 19:39

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

Кто-нибудь знает, если в Surface шейдере задать параметр noambient, т.е. выключить окружающий свет, то как сделать финальный цвет не черный?
По логике если финальный цвет получается чёрный без амбиента, то можно его чорным сделать и с включённым амбиентом, тупо придав амбиенту чёрный цвет в Edit -> Render Settings. Тамже можно его и белым сделать и каким угодно.

WISHMASTER35 27.10.2012 21:52

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

void MyFinalColor(Input IN, SurfaceOutput o, inout fixed4 color) {
color.rgb = o.Albedo.rgb * UNITY_LIGHTMODEL_AMBIENT * 2;
color.a = o.Alpha;
}

Вот только не пойму зачем на 2 умножать? Почему UNITY_LIGHTMODEL_AMBIENT сразу не содержит финальное значение?

pax 28.10.2012 00:38

Ответ: Вопросы от новичка
 
я как-то опытным путем домножал на 2.6...

jimon 28.10.2012 00:40

Ответ: Вопросы от новичка
 
может оно в sRGB, а видеокарте надо RGB, тогда гамма-коррекцию надо делать

Okay 28.10.2012 00:42

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

Как убрать слайдинг в стандартном Input Platform Controller?
визуально не получается. Слайдинг все равно есть. Что не есть хорошо
Очень нужно

pax 28.10.2012 00:44

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

Сообщение от Okay (Сообщение 241325)
Очень нужно

Код бы сюда запостил посмотреть, лень проект создавать для этого...


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

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