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

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

ただいまの
回答率

90.37%

  • C#

    9478questions

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

  • Unity

    5836questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1922questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 451

FujitaMaho

score 5

 前提・実現したいこと

初めて質問させていただきます。
今、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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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

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

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

 追記(訂正)

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

*追記*

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

Ken.cs

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

using UnityEngine;

public class Ken : MonoBehaviour, IHitReceiver
{
    // Inspectorで色を設定してください
    public Color OriginalColor;
    public Color OtherColor;
    Material Material;

    void Start()
    {
        // マテリアルをあらかじめ取得します
        this.Material = this.GetComponent<Renderer>().material;
        // 色を設定します
        this.Material.color = OriginalColor;
    }

    void Update()
    {
    }

    public void OnHit()
    {
        // 色を変えます
        if (Input.GetMouseButtonDown(0))
            this.Material.color = this.OtherColor;
        // 色を元に戻します
        else if (Input.GetMouseButtonDown(1))
            this.Material.color = this.OriginalColor;
    }
}
IHitReceiver.cs

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

namespace Assets
{
    interface IHitReceiver
    {
        void OnHit();
    }
}
InputRaycaster.cs

カメラに割り当ててください。

using UnityEngine;

public class InputRaycaster : MonoBehaviour
{
    void Start()
    {
    }

    void Update()
    {
        // マウスボタンが押されたらレイキャストします
        if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1))
            Raycast();
    }

    void Raycast()
    {
        // メインカメラ上のマウスカーソルのある位置からRayを飛ばす
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, Mathf.Infinity))
        {
            var target = hit.collider.gameObject;

            // Debug: Rayが当たるオブジェクトがあった場合はそのオブジェクト名をログに表示
            Debug.Log(target.name);

            // レイキャストの衝突対象が、入力を受け付けるインターフェースを持っていればヒット判定を出します。
            var hitReciever = target.GetComponent<IHitReceiver>();
            if (hitReciever != null)
                hitReciever.OnHit();
        }
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/20 19:49

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

    キャンセル

  • 2018/10/20 19: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

    キャンセル

  • 2018/10/22 12:11

    色々教えていただきありがとうございました。

    キャンセル

  • 2018/10/22 12:15

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/19 13:41

    投稿後に気づきましたが、質問文にcubeとあるので、UIの機能ではないですね…。
    あと、レイを出す方法なら、Input.GetMouseButtonDownでも特に問題なさそうです。
    だとすると、この回答は適切ではないですね…失礼しました。

    ただ、cube=ボタンなのであれば、UIの機能を使った方が分かりやすいかもしれないので、一度試してみると良いかもしれません。

    キャンセル

  • 2018/10/20 19:45

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

    キャンセル

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

  • ただいまの回答率 90.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    9478questions

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

  • Unity

    5836questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1922questions

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