У меня проблема с пониманием того, как сохранить ссылку на объект, который ранее был поражен raycast.Единство raycast, на raycast оставить, как? C#
, например, я могу иметь raycast сценарий положить на камеру моего 1rst контроллера человека, идущего от положения камеры к forwad вектора * некоторые значения
этот сценарий присоединен к камере
public class raycast : MonoBehaviour {
float lenthRay = 10.0f;
Vector3 originePos;
Vector3 dir;
RaycastHit hitinfo;
GameObject hitten;
bool isHitting;
Color beforC;
int selectionLayer = 9;
void Update() {
originePos = Camera.main.transform.position;
dir = Camera.main.transform.forward * lenthRay;
Debug.DrawRay(originePos, dir, Color.blue);
if (Physics.Raycast(originePos, dir, out hitinfo, lenthRay , selectionLayer)) {
hitten = hitinfo.transform.gameObject;
MeshRenderer tmp = hitten.transform.GetComponent<MeshRenderer>();
beforC = tmp.material.color;
tmp.material.color = Color.black;
}
//hitten.transform.GetComponent<MeshRenderer>().material.color = beforC;
print(hitten.name);
}
}
это работает прекрасно, за исключением случаев, когда я пытаюсь получить доступ к геймобжекты вне моего подводные камни и течения, если условие (например, печать print(hitten.name)
)
я получаю эту ошибку прежде, чем поразить объект из правого слоя:
NullReferenceException: Object reference not set to an instance of an object
raycast.Update() (at Assets/raycast.cs:30)
тогда, когда я ударил объект это нормально
но проблема в том, что я не понимаю, как я могу изменить обратно объект цвет до его первоначального цвета (beforC)
после поворота его до Color.black
, когда луч выходит из объекта
Это то, что я пытаюсь сделать в прокомментированной строке, но я просто получаю ту же ошибку, что и с печатью, и ничто не становится черным ,
я попытался это:
originePos = Camera.main.transform.position;
dir = Camera.main.transform.forward * lenthRay;
Debug.DrawRay(originePos, dir, Color.blue);
isHitting = Physics.Raycast (originePos, dir, out hitinfo, lenthRay, selectionLayer);
if (isHitting) {
hitten = hitinfo.transform.gameObject;
MeshRenderer tmp = hitten.transform.GetComponent<MeshRenderer>();
beforC = tmp.material.color;
tmp.material.color = Color.black;
}
if(!isHitting){
hitten.transform.GetComponent<MeshRenderer>().material.color = beforC;
print(hitten.name);
}
, но он не работает либо
вы можете мне помочь понять логику, я должен использовать заранее спасибо
Я считаю, что проблема заключается в том, что ваш хостинг GameObject не инициализирован, чтобы проверить, если это так, инициализируйте его значением по умолчанию и посмотрите, что произойдет. – MSB
@MSB да, это не было инициализировано, поэтому я добавил 'void Start() { \t \t hitten = null; \t} 'но я не вижу никаких изменений –
извините, мой вопрос на самом деле не ясен, это не значит, что у вас больше нет ошибки, речь идет о том, как получить доступ к последнему объекту raycasthit, когда он больше не попадает –