質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1093閲覧

オブジェクト間の距離によってオブジェクトの色が変わるようにしたい

Eightuma98

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/06/11 11:46

前提

Unityでゲーム開発をしています。自分のキャラクターが壁に近づいたら徐々に壁の色が変化するようにし、離れると徐々に元の色に戻っていくようにしたいのですがその方法がわかりません。
またオブジェクト間の距離をどのように扱えばいいのでしょう?
ご存知の方がいましたら是非教えていただきたいです。

実現したいこと

・オブジェクトが壁に近づいたら徐々に壁の色が変化するようにしたい。
・壁からの距離が遠くなると徐々に元の色に戻るようにしたい。
・RGBAを指定した値に変化させたい。

該当のソースコード

c#

1public class MaterialController : MonoBehaviour 2{ 3 //自分の位置 4 private Vector3 characterPositon = new Vector3(); 5 //壁の位置 6 private Vector3 wallPosition = new Vector3(); 7 8 [SerializeField] 9 private GameObject wallObj; 10 private Material wallMaterial; 11 12 //変化前の色 13 private Color startColor; 14 //変化後の色 15 private Color endColor; 16 17 // Start is called before the first frame update 18 void Start() 19 { 20 wallMaterial = wallObj.GetComponent<Renderer>().material; 21 startColor = new Color(0, 0, 0, 1.0f); 22 endColor = new Color(1.0f, 0, 0, 1.0f); 23 } 24 25 // Update is called once per frame 26 void Update() 27 { 28 characterPositon = this.gameObject.transform.position; 29 wallPosition = wallObj.transform.position; 30 31 //壁までの距離 32 var distance = Vector3.Distance(cubePosition, characterPositon); 33 34 //Color.Lerpを使う? 35 cubeMaterial.color = Color.Lerp(startColor, endColor, ); 36 } 37} 38

試したこと

Color.Lerpを使用したのですが、第三引数に何を置けばいいのかわからなかったため色の変化はできませんでした。
そもそもColor.Lerpでいいのかもわからず。。。

補足情報(FW/ツールのバージョンなど)

Unity 2021.1.24f1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bboydaisuke

2022/06/11 12:17

> 自分のキャラクターが壁に近づいたら Vector3.Distance では「オブジェクト同士の pivot の座標」の距離しか測れませんが、それでいいんですか?例えばでっかい壁とか長~い壁とかある時はどう扱うのか疑問に思いました。
Eightuma98

2022/06/11 12:34

壁全体ではなく色が変わる壁だけは別の小さなオブジェクトにする予定なのでVector3.Distanceでも大丈夫です。
guest

回答1

0

ベストアンサー

距離によって色を合成してやればいいんじゃないかと思います。

C#

1using UnityEngine; 2 3[RequireComponent(typeof(Renderer))] 4public class ChangeColorScript : MonoBehaviour 5{ 6 [SerializeField] float _changeColorThreshold = 5f; 7 [SerializeField] Color _startColor = Color.blue; 8 [SerializeField] Color _endColor = Color.red; 9 Transform _target; 10 Material _mat; 11 12 void Start() 13 { 14 _mat = GetComponent<Renderer>().material; 15 var go = GameObject.FindGameObjectWithTag("Player"); 16 17 if (go) 18 _target = go.transform; 19 else 20 Debug.LogWarning("ターゲットとなる Player タグのついたオブジェクトがシーン上に存在しません"); 21 } 22 23 void Update() 24 { 25 if (!_target) return; 26 float distance = Vector3.Distance(transform.position, _target.position); 27 28 if (distance < _changeColorThreshold) 29 { 30 Color c = (_endColor * (_changeColorThreshold - distance) + _startColor * distance) / _changeColorThreshold; 31 _mat.color = c; 32 } 33 } 34}

イメージ説明

投稿2022/06/11 13:15

bboydaisuke

総合スコア5270

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Eightuma98

2022/06/11 14:42

ありがとうございます!無事にできました! _changeColorThresholdは変化が開始するオブジェクト間の距離を定義しているのでしょうか?
bboydaisuke

2022/06/11 15:42

そうです。threshold は閾値という意味です。
Eightuma98

2022/06/11 16:07

なるほど、こういう方法があるんですね。勉強になりました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問