Ошибка скрипта .
|
|
Adom | Дата: Четверг, 29 Августа 2013, 22:40 | Сообщение # 1 |
Печенька!
Сейчас нет на сайте
| Я сделал здоровье для игрока так вот когда меня убивает враг у меня вылазит эта ошибка и игра останавливаеться. MissingReferenceException: The object of type 'Transform' 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. Код using UnityEngine; using System.Collections;
public class XP : MonoBehaviour { public Transform Player; public Transform Bullet; public float xp; public float Health; public float CurXP;
// Use this for initialization void Start () { } void Awake(){ if (networkView.isMine){ enabled = true; } } // Update is called once per frame void Update () { if(xp > 100){ xp =100; } if(CurXP >100){ CurXP = 100; } } void OnTriggerEnter(){ if(GameObject.FindWithTag("Bullet")){ xp -=1f; CurXP -=1f; if(xp ==0){ Destroy(GameObject.FindWithTag("Player")); } } if(GameObject.FindWithTag("Apteka")&& xp < 100){ xp +=Time.deltaTime; if(xp == 100){ xp = 100; } } } void OnGUI(){ if(GameObject.FindWithTag("Player")){ GUI.Label(new Rect(10, Screen.height - 40, 120, 20),"Xp:"+(int)CurXP+ "/"+Health); } } }
Сообщение отредактировал Adom - Четверг, 29 Августа 2013, 22:41 |
|
| |
Izaron | Дата: Четверг, 29 Августа 2013, 22:56 | Сообщение # 2 |
Rammstein forever
Сейчас нет на сайте
| Player в коде уничтожается, но после этого еще где-нибудь используется
|
|
| |
Adom | Дата: Четверг, 29 Августа 2013, 22:58 | Сообщение # 3 |
Печенька!
Сейчас нет на сайте
| Izaron,Хм сейчас поищу .=)
|
|
| |
Izaron | Дата: Четверг, 29 Августа 2013, 23:00 | Сообщение # 4 |
Rammstein forever
Сейчас нет на сайте
| if(GameObject.FindWithTag("Player") != null)
добавь перед Destroy игрока
|
|
| |
SomeOneInTheMask | Дата: Четверг, 29 Августа 2013, 23:08 | Сообщение # 5 |
Stranger
Сейчас нет на сайте
| хм... unity вроде обычно пишет какой скрипт ошибку возвращает
Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)
|
|
| |
Izaron | Дата: Четверг, 29 Августа 2013, 23:28 | Сообщение # 6 |
Rammstein forever
Сейчас нет на сайте
| Цитата (SomeOneInTheMask) хм... unity вроде обычно пишет какой скрипт ошибку возвращает А у нас вроде выложили скрипт, а не проект?Добавлено (29.08.2013, 23:28) --------------------------------------------- Напрягают строчки: if(xp == 100){ xp = 100; } Скрипт эту фигню просто проскакивает, и хп до бесконечности увеличивается
|
|
| |
Adom | Дата: Четверг, 29 Августа 2013, 23:32 | Сообщение # 7 |
Печенька!
Сейчас нет на сайте
| Эмм я посмотрел на что он ругаеться и он ругаеться на скрипт врага а точнее на это строку . Код var playerDirection : Vector3 = (_playerTransform.position - _thisTransform.position ).normalized;
|
|
| |
SomeOneInTheMask | Дата: Четверг, 29 Августа 2013, 23:41 | Сообщение # 8 |
Stranger
Сейчас нет на сайте
| Цитата (Izaron)
А у нас вроде выложили скрипт, а не проект?
да, но скрипт работает в проекте, а в описании к ошибке unity пишет название скрипта, в котором произошла ошибка...
Карта моего канала по созданию игр на Unity3d, можно даже заказать урок бесплатно)
|
|
| |
Izaron | Дата: Четверг, 29 Августа 2013, 23:44 | Сообщение # 9 |
Rammstein forever
Сейчас нет на сайте
| Adom, значит, ты пытаешься в скрипте врага взять позицию игрока, которой может не быть, если игрока не существует, т.е. был удален. Как-нибудь измени скрипт врага, чтобы учитывалас возможность несуществования игрока
Сообщение отредактировал Izaron - Четверг, 29 Августа 2013, 23:45 |
|
| |
Adom | Дата: Пятница, 30 Августа 2013, 18:44 | Сообщение # 10 |
Печенька!
Сейчас нет на сайте
| ага спасибо Добавлено (30.08.2013, 18:44) --------------------------------------------- Блин я досихпор не могу решить эту ошибку помогите !
|
|
| |
Izaron | Дата: Пятница, 30 Августа 2013, 19:26 | Сообщение # 11 |
Rammstein forever
Сейчас нет на сайте
| Цитата (Adom) Блин я досихпор не могу решить эту ошибку помогите ! Окей, сделаем тебе подарок к днюхе) Выложи скрипты (можно в ЛС), попытаюсь разобраться. По-любому ошибка из-за того, что игрок в какой-либо момент перестает существовать
|
|
| |
Adom | Дата: Пятница, 30 Августа 2013, 20:51 | Сообщение # 12 |
Печенька!
Сейчас нет на сайте
| Спасибо =) , вот скрипты которые используються. Код using UnityEngine; using System.Collections;
public class XP : MonoBehaviour { public Transform Player; public Transform Bullet; public float xp; public float Health; public float CurXP;
// Use this for initialization void Start () { } void Awake(){ if (networkView.isMine){ enabled = true; } } // Update is called once per frame void Update () { if(xp > 100){ xp =100; } if(CurXP >100){ CurXP = 100; } } void OnTriggerEnter(){ if(GameObject.FindWithTag("Bullet")){ xp -=1f; CurXP -=1f; if(xp <0){ Destroy(GameObject.FindWithTag("Player")); Destroy(GameObject.FindWithTag("Enemy")); } } if(GameObject.FindWithTag("Apteka")&& xp < 100){ xp +=Time.deltaTime; if(xp == 100){ xp = 100; } } } void OnGUI(){ if(GameObject.FindWithTag("Player")){ GUI.Label(new Rect(10, Screen.height - 40, 120, 20),"Xp:"+(int)CurXP+ "/"+Health); } } } И вот я переделал скрипт врага на шарп. Код using UnityEngine; using System.Collections;
public class Ai : MonoBehaviour { // Make sure there is always a character controller public CharacterController controller;
// скорость ходьбы и скорость поворота в секунду float moveSpeed = 2; float turnSpeed = 90;
Transform spawnPoint; float bulletSpeed = 20;
private CharacterController _controller; private Transform _thisTransform; public Transform playerTransform;
public Transform bullet; //Префаб патрона public int BulletForce = 5000; //Скорость патрона public AudioClip Fire; //Аудиоклип воспроизводящийся во время стрельбы
void Start (){ // Получаем контроллер _controller = GetComponent<CharacterController>();
// Получаем компонент трансформации объекта, к которому привязан данный компонент _thisTransform = transform;
// Получаем компонент трансформации игрока if (playerTransform == null && GameObject.FindWithTag("Player")) playerTransform = GameObject.FindWithTag("Player").transform;
} void Update (){ // направление на игрока if(GameObject.FindWithTag("Player") != null); Vector3 playerDirection = (playerTransform.position - _thisTransform.position).normalized ; // угол поворота на игрока float angle = Vector3.Angle(_thisTransform.forward, playerDirection);
// максимальный угол поворота на текущем кадре float maxAngle = turnSpeed * Time.deltaTime;
// Вычисляем прямой поворот на игрока Quaternion rot = Quaternion.LookRotation(playerTransform.position - _thisTransform.position); // поворачиваем врага на игрока с учетом скорости поворота if (maxAngle < angle) { _thisTransform.rotation = Quaternion.Slerp(_thisTransform.rotation, rot, maxAngle / angle); } else
{ _thisTransform.rotation = rot; }
// если дистанция до игрока больше трех метров if (Vector3.Distance(playerTransform.position, _thisTransform.position) >100.0f) { // двигаемся к игроку _controller.Move(_thisTransform.forward * moveSpeed * Time.deltaTime); } else // если меньше или равна трем метрам { if (Vector3.Distance(playerTransform.position, _thisTransform.position) > 0) { Shoot(); // здесь например стреляем в игрока } } // гравитация _controller.Move(Vector3.down * 10.0f * Time.deltaTime); } void Shoot(){ Transform BulletInstance = (Transform) Instantiate(bullet, GameObject.Find("BulletSpawnPoint3").transform.position, Quaternion.identity); //Генерится префаб патрона в координатах объекта "BulletSpawnPoint" BulletInstance.rigidbody.AddForce(transform.forward * BulletForce); //Сгенерированый патрон отправляется вперед со скоростью "BulletForce" audio.PlayOneShot(Fire);//проигрываем звук выстрела } }
Сообщение отредактировал Adom - Пятница, 30 Августа 2013, 20:52 |
|
| |
Izaron | Дата: Пятница, 30 Августа 2013, 21:42 | Сообщение # 13 |
Rammstein forever
Сейчас нет на сайте
| Цитата (Adom) void Update (){ // направление на игрока if(GameObject.FindWithTag("Player") != null); В третьей строке точка с запятой зачем? Сделать так попробуй: void Update() { if(GameObject.FindWithTag("Player") != null) { // Весь код, который был в апдейте, исключая прокомментированный выше } }
Цитата (Adom) // Получаем компонент трансформации игрока if (playerTransform == null && GameObject.FindWithTag("Player")) playerTransform = GameObject.FindWithTag("Player").transform; Убери playerTransform == null
|
|
| |
Adom | Дата: Пятница, 30 Августа 2013, 22:34 | Сообщение # 14 |
Печенька!
Сейчас нет на сайте
| Код using UnityEngine; using System.Collections;
public class Ai : MonoBehaviour { // Make sure there is always a character controller public CharacterController controller;
// скорость ходьбы и скорость поворота в секунду float moveSpeed = 2; float turnSpeed = 90;
Transform spawnPoint; float bulletSpeed = 20;
private CharacterController _controller; private Transform _thisTransform; private Transform playerTransform;
public Transform bullet; //Префаб патрона public int BulletForce = 5000; //Скорость патрона public AudioClip Fire; //Аудиоклип воспроизводящийся во время стрельбы
void Start (){ // Получаем контроллер _controller = GetComponent<CharacterController>();
// Получаем компонент трансформации объекта, к которому привязан данный компонент _thisTransform = transform;
// Получаем компонент трансформации игрока if (GameObject.FindWithTag("Player")) playerTransform = GameObject.FindWithTag("Player").transform;
} void Update (){ // направление на игрока if(GameObject.FindWithTag("Player") != null){ Vector3 playerDirection = (playerTransform.position - _thisTransform.position).normalized ; // угол поворота на игрока float angle = Vector3.Angle(_thisTransform.forward, playerDirection);
// максимальный угол поворота на текущем кадре float maxAngle = turnSpeed * Time.deltaTime;
// Вычисляем прямой поворот на игрока Quaternion rot = Quaternion.LookRotation(playerTransform.position - _thisTransform.position); // поворачиваем врага на игрока с учетом скорости поворота if (maxAngle < angle) { _thisTransform.rotation = Quaternion.Slerp(_thisTransform.rotation, rot, maxAngle / angle); } else
{ _thisTransform.rotation = rot; }
// если дистанция до игрока больше трех метров if (Vector3.Distance(playerTransform.position, _thisTransform.position) >100.0f) { // двигаемся к игроку _controller.Move(_thisTransform.forward * moveSpeed * Time.deltaTime); } else // если меньше или равна трем метрам { if (Vector3.Distance(playerTransform.position, _thisTransform.position) > 0) { Shoot(); // здесь например стреляем в игрока } } // гравитация _controller.Move(Vector3.down * 10.0f * Time.deltaTime); } } void Shoot(){ Transform BulletInstance = (Transform) Instantiate(bullet, GameObject.Find("BulletSpawnPoint3").transform.position, Quaternion.identity); //Генерится префаб патрона в координатах объекта "BulletSpawnPoint" BulletInstance.rigidbody.AddForce(transform.forward * BulletForce); //Сгенерированый патрон отправляется вперед со скоростью "BulletForce" audio.PlayOneShot(Fire);//проигрываем звук выстрела } } Правильно?
|
|
| |