Непонятный бред с Raycast'ом

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Непонятный бред с Raycast'ом

Сообщение Lolozavar 18 апр 2018, 23:24

Я, значит, хочу сделать так, чтобы при нажатии на фигурку (Каждая такая фигурка имеет прикреплённый к нему скрипт Figure), она пускала в все 4 стороны лучи и заносила тех, в кого попал луч (если они есть) в массив Enemies, а потом производила с ними манипуляции, например сменяла цвет фигурки врага на красный.
Вот код:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Figure : MonoBehaviour {

        GameObject[] Tiles = new GameObject[4];
        RaycastHit[] Enemies = new RaycastHit[4];
        RaycastHit hit;
        private Renderer renderer;

        void Start () {
                renderer = GetComponent<Renderer> ();
        }
        void OnMouseDown(){
               ShowPosMoves();
        }

public void ShowPosMoves(){
                try {
                        Tiles [0] = GameObject.Find ((this.transform.position.x + 1).ToString () + (this.transform.position.z));
                        Tiles [1] = GameObject.Find ((this.transform.position.x - 1).ToString () + (this.transform.position.z));
                        Tiles [2] = GameObject.Find ((this.transform.position.x).ToString () + (this.transform.position.z + 1));
                        Tiles [3] = GameObject.Find ((this.transform.position.x).ToString () + (this.transform.position.z - 1));
                        foreach (GameObject go in Tiles) {
                                go.GetComponent<TileScript> ().CanBePressed = true;
                                go.GetComponent<Renderer> ().material.color = Color.yellow;
                        }
                        Debug.Log("Первая часть прошла успешно");
                } catch {
                }
                if (Physics.Raycast (this.transform.position, Vector3.forward, out hit, FigSpd, 8))
                        Enemies [0] = hit;
                if (Physics.Raycast (this.transform.position, Vector3.back, out  hit, FigSpd, 8))
                        Enemies [1] = hit;
                if (Physics.Raycast (this.transform.position, Vector3.right, out  hit, FigSpd, 8))
                        Enemies [2] = hit;
                if (Physics.Raycast (this.transform.position, Vector3.left, out  hit, FigSpd, 8))
                        Enemies [3] = hit;

                for(int i = 0;i < Enemies.Length;i++){
                     Enemies[i].transform.gameObject.GetComponent<Renderer>().material.color = Color.red;
                }
        }
 

Ошибку (NullReferenceException) выдаёт на строке
Синтаксис:
Используется csharp
 Enemies[i].transform.gameObject.GetComponent<Renderer>().material.color = Color.red;
 

При нажатии на фигуру

Надеюсь на помощь и заранее спасибо :)
Lolozavar
UNец
 
Сообщения: 14
Зарегистрирован: 03 июл 2017, 18:11

Re: Непонятный бред с Raycast'ом

Сообщение Paul Siberdt 19 апр 2018, 00:29

В строчке
Enemies[i].transform.gameObject.GetComponent<Renderer>().material.color = Color.red;
есть несколько вариантов просёра: сам объект, рендерер и материал.

Конструкцию можно упростить, если Enemies является монобехом, убрав садо-мазо подвыподверты, например, до такого:
Enemies[i].GetComponent<Renderer>().material.color

И проверьте дебагами, что именно у вас эксептит. Как только увидете, в какой строке ошибка - думаю, сразу поймете, в чем проблема.
Debug.Log(Enemies[i]); // Тут или у вас массив нулевой или не тот индекс или пустой объект
Debug.Log(Enemies[i].GetComponent<Renderer>()); // Действительно ли висит рендерер на объекте?
Debug.Log(Enemies[i].GetComponent<Renderer>().material); // А как с материалом? Он имеет место быть?
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Непонятный бред с Raycast'ом

Сообщение 1max1 19 апр 2018, 05:27

Эх, сейчас бы имена объектов координатами называть...
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Непонятный бред с Raycast'ом

Сообщение Paul Siberdt 19 апр 2018, 18:26

1max1 писал(а):Эх, сейчас бы имена объектов координатами называть...

В этом месте я даже не пытался понять. :)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Непонятный бред с Raycast'ом

Сообщение Lolozavar 19 апр 2018, 21:27

Paul Siberdt писал(а):В строчке
Enemies[i].transform.gameObject.GetComponent<Renderer>().material.color = Color.red;
есть несколько вариантов просёра: сам объект, рендерер и материал.

Конструкцию можно упростить, если Enemies является монобехом, убрав садо-мазо подвыподверты, например, до такого:
Enemies[i].GetComponent<Renderer>().material.color

И проверьте дебагами, что именно у вас эксептит. Как только увидете, в какой строке ошибка - думаю, сразу поймете, в чем проблема.
Debug.Log(Enemies[i]); // Тут или у вас массив нулевой или не тот индекс или пустой объект
Debug.Log(Enemies[i].GetComponent<Renderer>()); // Действительно ли висит рендерер на объекте?
Debug.Log(Enemies[i].GetComponent<Renderer>().material); // А как с материалом? Он имеет место быть?


Огромное спасибо :ymhug:
Дело в том что я не повесил на фигуры материал, и на них стоял дефолтный материал который нельзя менять)
Lolozavar
UNец
 
Сообщения: 14
Зарегистрирован: 03 июл 2017, 18:11


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 43