От RaycastHit на поверхности игрового объекта до случайной точки на игровом объекте на поверхности желе

#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, и использование преобразований, которые являются детищем желе, исправит вашу ошибку (именно поэтому она иногда случайным образом перестает работать) и позволит ей перемещаться