#c# #unity3d
Вопрос:
в принципе, у меня есть код, который превращает поверхность игрового объекта в желеобразное вещество https://heliosinteractive.com/jelly-shader-part-7/ Мне нужно, чтобы моя слизь всегда имела этот желеобразный эффект, а не только при попадании
Это исходный код, который я преобразовал во что-то подобное, но он каждый раз работает.
публичный класс JellyClickReceiver : однобокое поведение {
RaycastHit hit;
Ray clickRay;
Renderer modelRenderer;
float controlTime;
public Vector3[] positions;
void Start ()
{
modelRenderer = GetComponent<MeshRenderer>();
InvokeRepeating("shader", 1.0f, 6f); //calls the deformation function every 6s
}
// Update is called once per frame
void Update ()
{
controlTime = Time.deltaTime;
//clickRay = Camera.main.ScreenPointToRay(Input.mousePosition);
modelRenderer.material.SetFloat("_ControlTime", controlTime);
}
void shader()
{
controlTime = 0;
modelRenderer.material.SetVector("_ModelOrigin", transform.position);
modelRenderer.material.SetVector("_ImpactOrigin", positions[Random.Range(0, positions.Length)]);
//Debug.Log(hit.point);
}
}
Спасибо
Ответ №1:
Самое первое, что я замечу, будет то, что вы используете позиции[Случайные.Диапазон(0, позиции.Длина)] но это должны быть позиции.Длина-1 скорее всего, вы получаете ошибки в своем коде о том, что вы находитесь вне диапазона/недопустимый индекс в массиве.
Ваши позиции[] (и я не уверен, что вы вкладываете в это) будут просто плоскими значениями мирового пространства Vector3, которые не перемещаются. Если вы перемещаете желе, конечно, это не сработает.
В принципе, исходный код получает hit.point, который представляет собой положение в мировом пространстве (Вектор3), в котором радиопередача попала в желе, в зависимости от того, где вы нажали на экран.
Все, что он делает, — это создает из вектора направление в коде шейдера. Таким образом, эти позиции не обязательно должны быть очень точными, я думаю, что они могут быть просто в целом в правильном месте, но они должны быть в мировом пространстве относительно текущего положения желе.
Мой совет, (во-первых, сделайте это массивом.Длина-1 в вашем коде) сохраните тот же код, что и у вас, и вместо использования массива Vector3[] используйте массив преобразования и поместите некоторые игровые объекты, которые являются дочерними элементами тела желе. Переместите эти игровые объекты на позиции вокруг тела желе и перетащите их все в свой массив.
public Transform[] positions;
modelRenderer.material.SetVector("_ImpactOrigin", positions[Random.Range(0, positions.Length-1)].position);
фиксирующие положения.Длина-1, и использование преобразований, которые являются детищем желе, исправит вашу ошибку (именно поэтому она иногда случайным образом перестает работать) и позволит ей перемещаться