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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

2回答

918閲覧

オブジェクトの色をそれぞれ変えたい

FujitaMaho

総合スコア13

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2018/10/19 04:07

前提・実現したいこと

初めて質問させていただきます。
今、2つのcubeをSceneにいているのですが、その2つのcubeの色をそれぞれクリックイベントを使用して違う色に変えたいと思っています。

質問が二つあります。

1)クリックイベント(click)を使用しており、色を白から赤色に変えるところまではできました。
ですが、もう一度元の色に戻すことができません。
Input.GetMouseButtonDownを使用して色を元に戻そうとしているのですが、間違っているのでしょうか?

2)オブジェクトをクリックすると、2つとも同じ色になってしまいます。
1つを押したら赤色になり、もう1つを押したら紫色と言うように押したオブジェクトだけが色を変えられるようにしたいです。

よろしくお願いします。

発生している問題・エラーメッセージ

特にありません。

エラーメッセージ

該当のソースコード

ソースコード using System.Collections; using System.Collections.Generic; using UnityEngine; public class EventTriggerOne : MonoBehaviour { Rigidbody rigidBody; public Vector3 force = new Vector3(0, 10, 0); public ForceMode forceMode = ForceMode.VelocityChange; public GameObject ken_do; public GameObject ken_re; // Use this for initialization void Start () { rigidBody = gameObject.GetComponent<Rigidbody>(); } public void Event() { rigidBody.AddForce(force, forceMode); } // Update is called once per frame void Update () { if (Input.GetMouseButtonDown(0)) { Debug.Log("色が変わるよ!"); //ドの音 Material ken_do = this.GetComponent<Renderer>().material; ken_do.color = new Color(1.0f, 0.0f, 0.0f, 1.0f); //レの音 Material ken_re = this.GetComponent<Renderer>().material; ken_re.color = new Color(1.0f, 0.0f, 1.0f, 1.0f); } if(Input.GetMouseButtonDown(1)) { Debug.Log("元の色に変わるよ!"); Material ken_do = this.GetComponent<Renderer>().material; ken_do.color = new Color(0.0f, 0.0f, 0.0f, 1.0f); Material ken_re = this.GetComponent<Renderer>().material; ken_re.color = new Color(0.0f, 0.0f, 1.0f, 1.0f); } } }

試したこと

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

unityのバージョン 2017.3.03f

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

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

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

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

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

guest

回答2

0

ベストアンサー

「クリックした地点からカメラの向きに沿ったレイを飛ばし、それが当たったCubeの色を変える」という仕組みが必要です。

といっても、手習いとしてはそれでいいのですが、本来であればもう少し工夫したほうがよいかもしれません。「オブジェクト自身に自分の色を変えるという関数を持たせておき、レイが当たったらその関数を呼び出す」という作りにしたほうが多くの場合自然です。

ちなみに、ちょっと関係ないかもしれませんが、おすすめのチュートリアルを紹介します(Survival Shooter tutorial
)。その他、公式にいろいろあります。ビデオが英語なので面食らうかもしれませんが、その下にスクリプト(台本)が用意されており、例えばChromeだと右クリックで日本語翻訳できます。

追記(訂正)

ものすごくいまさらですが、追記分を訂正します。
わざわざ自分でRaycasterをC#で用意しなくても、次のような仕組みがあるようです。(https://qiita.com/JunShimura/items/4547563fbb2691f40626)

追記

久しぶりにUnityを触りたくなったので、コードも用意してみました。
こちらも参考にしました。

######Ken.cs
各Cubeに割り当ててください。色はインスペクターで設定してください。

C#

1using UnityEngine; 2 3public class Ken : MonoBehaviour, IHitReceiver 4{ 5 // Inspectorで色を設定してください 6 public Color OriginalColor; 7 public Color OtherColor; 8 Material Material; 9 10 void Start() 11 { 12 // マテリアルをあらかじめ取得します 13 this.Material = this.GetComponent<Renderer>().material; 14 // 色を設定します 15 this.Material.color = OriginalColor; 16 } 17 18 void Update() 19 { 20 } 21 22 public void OnHit() 23 { 24 // 色を変えます 25 if (Input.GetMouseButtonDown(0)) 26 this.Material.color = this.OtherColor; 27 // 色を元に戻します 28 else if (Input.GetMouseButtonDown(1)) 29 this.Material.color = this.OriginalColor; 30 } 31}

######IHitReceiver.cs
これはファイルを用意するだけで、ゲームオブジェクトには割り当てません。
Ken.csと同じフォルダに放り込んでください。

c#

1namespace Assets 2{ 3 interface IHitReceiver 4 { 5 void OnHit(); 6 } 7}

######InputRaycaster.cs
カメラに割り当ててください。

c#

1using UnityEngine; 2 3public class InputRaycaster : MonoBehaviour 4{ 5 void Start() 6 { 7 } 8 9 void Update() 10 { 11 // マウスボタンが押されたらレイキャストします 12 if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1)) 13 Raycast(); 14 } 15 16 void Raycast() 17 { 18 // メインカメラ上のマウスカーソルのある位置からRayを飛ばす 19 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 20 RaycastHit hit; 21 22 if (Physics.Raycast(ray, out hit, Mathf.Infinity)) 23 { 24 var target = hit.collider.gameObject; 25 26 // Debug: Rayが当たるオブジェクトがあった場合はそのオブジェクト名をログに表示 27 Debug.Log(target.name); 28 29 // レイキャストの衝突対象が、入力を受け付けるインターフェースを持っていればヒット判定を出します。 30 var hitReciever = target.GetComponent<IHitReceiver>(); 31 if (hitReciever != null) 32 hitReciever.OnHit(); 33 } 34 } 35}

投稿2018/10/19 04:16

編集2018/10/24 11:47
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

FujitaMaho

2018/10/20 10:49

レイと言うのは、Rayのことですよね? Rayのことを調べていたのですが、Rayとはなんなのでしょうか...? しょうもない質問だとは思いますが、どのサイトにもコードが実際に書かれいるだけでイマイチ使い方(仕組みなど)がわからないので、もしよければ教えていただきたいです。
退会済みユーザー

退会済みユーザー

2018/10/20 10:58

このあたりが参考になるかと。上二つでなんとなくわかったら、最後二つのリファレンスで、引数や仕様などを確認してみるといいかもしれません。ブラウザがchromeであれば、右クリック、日本語に翻訳で多少わかると思うのでおすすめです。 http://kan-kikuchi.hatenablog.com/entry/RayCast1 https://unity3d.com/jp/learn/tutorials/topics/physics/raycasting https://docs.unity3d.com/ScriptReference/Physics.Raycast.html?_ga=2.1198769.1607628400.1540032994-397330459.1539923245 https://docs.unity3d.com/ScriptReference/RaycastHit.html?_ga=2.193605293.1607628400.1540032994-397330459.1539923245
FujitaMaho

2018/10/22 03:11

色々教えていただきありがとうございました。
退会済みユーザー

退会済みユーザー

2018/10/22 03:15

どういたしまして、私も久しぶりにUnity触れたので楽しかったです。
guest

0

Input.GetMouseButtonDownではマウスカーソルがどこにあろうと反応してしまうため、この用途には不適です。

もし、UIの機能を使っているのであれば、こちらのように、Event Triggerを使えばよろしいかと思います。
この場合、ドのボタンとレのボタンに、同じスクリプトを別々にアタッチする方法がおすすめです。
ドとレで色が異なる場合でも、その色をインスペクター上で設定できるようにすれば、解決できます。

UIの機能ではない場合は、ppnさんの回答と同じです。

投稿2018/10/19 04:27

fiveHundred

総合スコア9803

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

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

fiveHundred

2018/10/19 04:41

投稿後に気づきましたが、質問文にcubeとあるので、UIの機能ではないですね…。 あと、レイを出す方法なら、Input.GetMouseButtonDownでも特に問題なさそうです。 だとすると、この回答は適切ではないですね…失礼しました。 ただ、cube=ボタンなのであれば、UIの機能を使った方が分かりやすいかもしれないので、一度試してみると良いかもしれません。
FujitaMaho

2018/10/20 10:45

丁寧に説明してくださり、ありがとうございます! cubeなのでボタンの機能はつけられないことまで教えていただき嬉しいです。 ボタンではなくただの色が変わるオブジェクト(表現があっているかはわかりませんが)にしたいと思っているので、またの機会に使わせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問