Показать сообщение отдельно
Старый 24.10.2012, 20:22   #677
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Ответ: Вопросы от новичка

Имею два класса(файла скрипта):
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); }
}


и в нужных скриптах прописал
private functions m;
    
void Awake() {gameObject.AddComponent<functions>(); } 
ну и далее m.Move...

наверное тоже очень некорректно, но работает.
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием