Notifications
Article
プレイヤーがブロックにあたったときのパーティクルを変更したい
Updated 10 months ago
233
0
やりたいこと
上の動画のように白いプレイヤーがブロックのマテリアルに応じて同じマテリアルのパーティクルを出したいのですが、この状態では灰色のブロックに触れた時もオレンジのマテリアルになってしまっています。
Unityお学びグループでUnityのtamtamさんからマテリアルは配列でpublicで変数宣言してマテリアルを設定するといいですよとご指摘を頂いたので実際にそのように変更してみました。
下のスクリプトはパーティクルにアタッチされたスクリプトです。ブロックに触れた時にInstatiateされたパーティクルを消すためのスクリプトです。これにマテリアルを設定しています。
ChangeMat関数でプレイヤーオブジェクトにアタッチされたスクリプトからプレイヤーがブロックに触れた時のbool関数を読み込んでそれに応じてマテリアルを変更したいと試みています。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class DestroyParticle : MonoBehaviour { public Material[] Mtr; public GameObject player; public GameObject particlemanager; public ParticleSystemRenderer ren; public string text; PlayerMovement move; ParticleManager particleM; // Use this for initialization void Start () { ren = GetComponent<ParticleSystemRenderer>(); particleM = particlemanager.GetComponent<ParticleManager>(); //シーンにあるゲームオブジェクトPlayerをアタッチしていないので変数の状態が変わっても認識しない。 move = player.GetComponent<PlayerMovement>(); text = "Destroy Particle"; } // Update is called once per frame void Update () { //ren.material = Mtr[0]; changeMat(); //Debug.Log("Block は" + move.isBlock); Destroy(this.gameObject, 1f); } void changeMat() { if (move.isBlock) { Debug.Log("isblock is true in destroyparticle"); ren.material = Mtr[0]; } if (move.isItemBlcok) { ren.material = Mtr[1]; } }
結果的にはこれがうまくいかずプレイヤーのスクリプトは認識はするもののブロックに触れた状態は認識されていませんでした。
おそらくプレイヤーのスクリプトをシーンのものからではなくprefabのプレイヤーオブジェクトにしているせいだと思いますがシーンのプレイヤーオブジェクトを選べないためどうしたものかといったところです。

解決策

Unityお学びグループにてUnityのtamtamさんが解決法を教えてくださいました。 ブロックのオブジェクトのスクリプトそれぞれにパーティクルのマテリアルを設定をしたほうが簡単との回答。 実際にやってみるとあっさりとできてしまいました。。。
以下はブロックのコライダーオブジェクトにつけたスクリプトです。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Block : MonoBehaviour { GameObject parent; public Material BlockMat; public ParticleSystem breakParticle; // Use this for initialization void Start () { parent = gameObject.transform.parent.gameObject; //BlockMat = GetComponent<Material>(); } // Update is called once per frame void Update () { } private void OnTriggerEnter(Collider other) { if (other.gameObject.name == "Player") { Destroy(parent); breakParticle.GetComponent<ParticleSystemRenderer>().material = BlockMat; Instantiate(breakParticle, parent.transform.position, Quaternion.identity); } } }

無事にうまくいきました! tamtamさん本当にありがとうございました。
Tags:
Satoshi Watanabe
Unity Beginner - Other
6
Comments