Нарисуйте произвольную фигуру на игровом объекте unity3d - PullRequest
0 голосов
/ 24 октября 2018

Я все еще новичок в единстве, и мне жаль, если это очень очевидный вопрос.На самом деле, я пытаюсь создать игру, в которой тонкий объект (белая палочка на рисунке ниже) пытается коснуться сферического объекта (оранжевый на рисунке ниже).Красные, зеленые, синие и желтые линии - это радиопередачи, запускаемые с вершины палки в разных направлениях. enter image description here

Основная цель - нарисовать на сфере черную фигуруиллюстрируя точки пересечения между палкой и сферой.Чтобы лучше понять это, мы видим на следующем изображении сцену с точки зрения вида сверху с тем, как она должна выглядеть, если ручка выполняет свою работу должным образом. enter image description here

С этой цельюЯ использовал этот код для рисования точки попадания raycast, но он не работает, потому что rend.material.mainTexture всегда null, и я не уверен, почему !!

RaycastHit hit_down, hit_right, hit_forward,  hit_left;         
        if (Physics.Raycast(stick.transform.position, stick.transform.TransformDirection(Vector3.down), out hit_down))
       {             
                 Debug.DrawRay(stick.transform.position, stick.transform.TransformDirection(Vector3.down) * hit_down.distance, Color.yellow);              
               Debug.Log("Point of contact down: "  + hit_down.point + " on " + hit_down.collider.gameObject.tag);
               if (hit_down.collider.gameObject.tag == "sphere")             
               {
         Renderer rend = hit_down.transform.GetComponent<Renderer>();
                     MeshCollider meshCollider = hit_down.collider as MeshCollider;

             Debug.Log(rend.material.mainTexture);
                     if (rend == null || rend.sharedMaterial == null || meshCollider == null)
                            return;
                     Texture2D tex = rend.material.mainTexture as Texture2D;
                     Vector2 pixelUV = hit_down.textureCoord;
                     pixelUV.x *= tex.width;
                     pixelUV.y *= tex.height;
                     tex.SetPixel((int)pixelUV.x, (int)pixelUV.y, Color.black);
                     tex.Apply();             
               } 
     }

Последний вопрос:правильный способ достижения моей цели?Есть ли другой, более эффективный способ выполнить эту задачу?

Заранее спасибо.

1 Ответ

0 голосов
/ 25 октября 2018

Проблема может заключаться в строке Renderer rend = hit_down.transform.GetComponent<Renderer>();

Поскольку rend.material.mainTexture возвращает null, может показаться, что само по себе rend на самом деле null.Это может быть вызвано типом Renderer, который вы пытаетесь получить.

Возможно, вы захотите попробовать Renderer rend = hit_down.transform.GetComponent<LineRenderer>();.Все остальное должно работать как задумано

...