アイテムなどを落とした時に出る砂埃のエフェクトの量や寿命などのパラメーターを、アイテムが落下した場所によってスクリプトで変えてみました。
まず、前の記事の方法で落下した場所のUV座標を使ってテクスチャから色を取得します。今回は、Planeオブジェクトにつけたテクスチャでなく、スクリプトにアタッチしたテクスチャを使います。
このテクスチャは、Planeのマテリアルに付けた時、真ん中のあたりが白くて、右が灰色、手前が黒くなっています。
VFXグラフ
VFXグラフでは、一度に出すパーティクルの数やサイズなどをスクリプトやインスペクタから設定できるようにします。
このとき、色の0~1の値をそのままセットすると、最大値と掛け合わせることで、白い部分に落下した時は最大値に、黒い部分に落下した時は0になります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Experimental.VFX;
public class GetUVScript : MonoBehaviour
{
[SerializeField] Text text;
[SerializeField] Image image;
[SerializeField] Texture2D tex;
[SerializeField] VisualEffect vfx;
//MeshRenderer meshRenderer;
// Start is called before the first frame update
void Start()
{
//meshRenderer = GetComponent();
}
// Update is called once per frame
void Update()
{
}
private void OnCollisionEnter(Collision collision)
{
if (collision.collider.tag == "Item")
{
Vector3 pos = collision.transform.position;
RaycastHit hit;
//tex = meshRenderer.material.mainTexture as Texture2D;
// Cubeの中心から衝突した地点へ向かってレイを飛ばす
if (Physics.Raycast(pos, collision.contacts[0].point - pos, out hit, Mathf.Infinity))
{
Vector2 uv = hit.textureCoord;
Color[] pix = tex.GetPixels(Mathf.FloorToInt(uv.x * tex.width), Mathf.FloorToInt(uv.y * tex.height), 1, 1);
text.text = pix[0].ToString();
image.color = pix[0];
var v = Instantiate(vfx, hit.point,transform.rotation); // エフェクトを生成
v.SetFloat("Count", pix[0].r); // パラメーターにR値を設定
v.SetFloat("Lifetime", pix[0].r);
v.SetFloat("Size", pix[0].r);
v.Play(); // エフェクトを再生
}
}
}
}
今回はR値だけを使っていますが、G,B,A値も使って様々な表現ができると思います。