Я просто хотел добавить, что может быть более простой способ добиться того, чего вы хотите, используя проекторы< /а>. Это общий инструмент в Unity, используемый для рисования различных эффектов на поверхности сетки в режиме реального времени, таких как пулевые отверстия. Используя тот же принцип, вы можете выделить некоторые области сетки. Вы можете думать о проекторе как о фонарике: все, на что падает его свет, меняет свою текстуру. В разделе Standard Assets/Effects есть несколько примеров проекторов. Возможно, вы захотите начать с этого.
Чтобы создать проектор, создайте пустой игровой объект => Добавить компонент => Проектор.
ИЗМЕНИТЬ
Еще одна идея, которую вы можете попробовать, — это использовать цвета вершин. Каждая вершина меша содержит помимо координат параметр цвета, доступный через шейдер. Таким образом, вы можете изменить цвет определенного набора вершин, чтобы выделить их. Здесь есть 2 момента, на которые следует обратить внимание:
1) Большинство шейдеров предпочитают игнорировать цвет вершин, за исключением шейдера спрайтов. Вам понадобится собственный шейдер, например этот а>.
2) Вам нужно каким-то образом знать, какие именно вершины вы хотите выделить. Что вы можете сделать, так это перебрать Mesh.boneWeights. Например, если вы хотите выбрать руку, вам нужны все вершины, которые имеют вес > 1 для индекса кости руки. Как найти индекс кости руки? Этот индекс соответствует индексу в SkinnedMeshRenderer.bones. Или просто выберите вершину, о которой вы точно знаете, что она принадлежит руке, и посмотрите веса ее костей, чтобы найти индекс.
Вот пример скрипта, который изменяет цвета вершин на основе выбранного индекса кости. Прикрепите его к вашему SkinnedMeshRenderer (обычно это объект иерархии второго уровня):
using UnityEngine;
using System.Collections;
public class BoneHiglighter : MonoBehaviour {
public Color32 highlightColor = Color.red;
public Color32 regularColor = Color.white;
public SkinnedMeshRenderer smr;
// Just for sake of demonstration
public Transform bone;
private Transform prevBone;
// Find bone index given bone transform
int GetBoneIndex(Transform bone) {
Debug.Assert(smr != null);
var bones = smr.bones;
for (int i = 0; i < bones.Length; ++i) {
if (bones[i] == bone) return i;
}
return -1;
}
// Change vertex colors highlighting given bone
void Highlight(Transform bone) {
Debug.Assert(smr != null);
var idx = GetBoneIndex(bone);
var mesh = smr.sharedMesh;
var weights = mesh.boneWeights;
var colors = new Color32[weights.Length];
for (int i = 0; i < colors.Length; ++i) {
float sum = 0;
if (weights[i].boneIndex0 == idx && weights[i].weight0 > 0)
sum += weights[i].weight0;
if (weights[i].boneIndex1 == idx && weights[i].weight1 > 0)
sum += weights[i].weight1;
if (weights[i].boneIndex2 == idx && weights[i].weight2 > 0)
sum += weights[i].weight2;
if (weights[i].boneIndex3 == idx && weights[i].weight3 > 0)
sum += weights[i].weight3;
colors[i] = Color32.Lerp(regularColor, highlightColor, sum);
}
mesh.colors32 = colors;
}
void Start() {
// If not explicitly specified SkinnedMeshRenderer try to find one
if (smr == null) smr = GetComponent<SkinnedMeshRenderer>();
// SkinnedMeshRenderer has only shared mesh. We should not modify it.
// So we make a copy on startup, and work with it.
smr.sharedMesh = (Mesh)Instantiate(smr.sharedMesh);
Highlight(bone);
}
void Update() {
if (prevBone != bone) {
// User selected different bone
prevBone = bone;
Highlight(bone);
}
}
}
См. пример проекта: https://www.dropbox.com/s/yfoqo44bubcr48s/HighlightBone.zip?dl=0
Демонстрация: http://jolly-squirrel.droppages.com/bones/index.html — щелкните по частям тела, чтобы выделить их.
person
Yuri Nudelman
schedule
25.12.2015