Элита
Регистрация: 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() {m = 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
|