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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

7260閲覧

Unity C# ドアの開閉プログラム OnTriggerEnter内のコードが呼ばれない、、?

alb14laq

総合スコア27

C#

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

Unity3D

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

Unity

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

0グッド

2クリップ

投稿2016/10/16 13:30

編集2016/10/18 05:01

Uniryのアニメーションを使ったドア開閉のプログラムの質問です。
Unityでアニメーションを使ったドアの開閉プログラムを書いているのですが上手くいかないところがあります。
プレイヤーがドア付近(IsTriggerを使った当たり判定)でキーボードのmを押すとドアが開く、というプログラムです。

C#

1using UnityEngine; 2using System.Collections; 3 4public class Hitarea : MonoBehaviour { 5 6 public Animator anim; 7 private bool near; 8 9 void Start () { 10 11 anim = GetComponent<Animator> (); 12 near = false; 13 } 14 15 void Update () { 16 if (Input.GetKeyDown ("m") && near) { 17 anim.SetBool ("open", true); 18 Debug.Log ("Hit m"); 19 } 20 if (Input.GetKeyDown ("k")) { 21 anim.SetBool ("open", false); 22 Debug.Log ("Hit k"); 23 } 24 } 25 26 void OnTriggerEnter(Collider collider){ 27 if (collider.gameObject.tag == "Player") { 28 near = true; 29 Debug.Log ("hoge01"); 30 } 31 } 32 33 void OnTriggerExit(Collider collider){ 34 near = false; 35 Debug.Log ("hoge02"); 36 } 37}

このコードですと、hoge01、hoge02のログはでて、当たり判定はされているようなのですが、当たり判定内でmを押しても反応せず。
Void Start()のnear=falseをtrueにするとHitmログが出てくるようになり、ドアも開きます(当たり判定関係ないのでどこでも開いてしまいます)
void Update()にOntriggerEnterのnear=trueが反映されていないのでしょうか。

アドバイスなどいただければありがたいです、、、
よろしくお願い致します。

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

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

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

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

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

aiueoao

2016/10/18 06:46

変数nearを一度publicにして、インスペクターで確認してみてはいかがでしょうか
alb14laq

2016/10/18 08:21

回答ありがとうございます。publicにしてみてもできず、誠に恐縮ですが、インスペクターというのもよくわかっておりません…。
aiueoao

2016/10/18 09:29

インスペクタビューは(設定を変えていなければ)オブジェクトを選択したときに画面右にでるTransform などの表示です。
alb14laq

2016/10/18 13:27

インスペクタビューにnearのチェック欄が出てくるようになりました。このnearにチェックをつけてもだめでした。このことからどのような原因がわかりますでしょうか?
aiueoao

2016/10/18 16:19

OnTriggerEnterが呼ばれたときインスペクタのnearにチェックが入りましたか?
alb14laq

2016/10/18 22:06

本来なら自動的にチェックが入るんですね。しかし、やはりhoge01ログは出てくるものの、その時nearにチェックは入りませんでした。やはりOnTriggerEnterから呼ばれてないのでしょうか。
aiueoao

2016/10/18 23:04

OnTriggerEnterは呼ばれてると思います。hoge01が呼ばれるならnear=trueになるはずですが、、hoge02は出てないですよね?
alb14laq

2016/10/19 00:48

私も呼ばれてるはずだと思ってなぜできないのかわからない状態です…。当たり判定内から出るとhoge2ログは出てきます。mを押すときはhoge02が出ていない状態の時にしています。
aiueoao

2016/10/19 02:22

このコードで試してみましたが問題はなかったです。白旗。
alb14laq

2016/10/19 03:10

プログラム面ではなくUnity上で間違いがあるのかもしれませんね…。Door/DoorK/HitAreaという階層で、HitAreaでIsTriggerにチェックをしたオブジェクトを置いています。スクリプトは1番上のDoorにつけています。
aiueoao

2016/10/19 04:36

子(HitArea)のCollider衝突判定を親で受け取れていないような気がします。OnTriggerEnter(Exit)は別スクリプトに別けてHitAreaにつけることは許されますか?子のOntriggerEnterで親のスクリプトにSendMessage  のような流れで親が衝突判定を知ることができると思います
alb14laq

2016/10/19 08:43

HitAreaにスクリプトをつけたところnearのチェックがつくようになりました!しかし今までのスクリプトをHitAreaにつけただけだとhoge01とHitmログは出てくるものの、ドアが開きませんでした(アニメーションが呼ばれない?) 別けてSendMessageというのを試させていただきます。
alb14laq

2016/10/19 08:53

SendMessageは文字列を送るのでしょうか?OnTriggerEnterのなにを送ればいいのかもよくわかっておりません。
guest

回答1

0

ベストアンサー

DoorにAnimatorがあるとして...

SendMessageはあまり推奨されていないような感じなので、親につけたコンポーネントを取得してます。

c#

1//親用 2using UnityEngine; 3using System.Collections; 4 5public class DoorCtrl : MonoBehaviour { 6 7 public Animator anim; 8 private bool near; 9 10 // Use this for initialization 11 void Start() 12 { 13 // anim = GetComponent<Animator>(); 14 anim = this.gameObject.GetComponent<Animator>(); 15 near = false; 16 } 17 18 19 void Update() 20 { 21 22 if (Input.GetKeyDown("m") && near) 23 { 24 anim.SetBool("open", true); 25 Debug.Log("Hit m"); 26 } 27 if (Input.GetKeyDown("k")) 28 { 29 anim.SetBool("open", false); 30 Debug.Log("Hit k"); 31 } 32 } 33 34 //子のスクリプトから呼ばれる 35 public void t_Enter() 36 { 37 near = true; 38 } 39 40 //子のスクリプトから呼ばれる 41 public void t_Exit() 42 { 43 near = false; 44 } 45}

c#

1//子用 2using UnityEngine; 3using System.Collections; 4 5public class HitArea: MonoBehaviour { 6 public DoorCtrl DoorCtrl; 7 8 void Start() 9 { 10 //親オブジェクトのコンポーネントを取得 11 DoorCtrl = transform.root.gameObject.GetComponent<DoorCtrl>(); 12 } 13 14 void OnTriggerEnter(Collider collider) 15 { 16 if (collider.gameObject.tag == "a") 17 { 18 // transform.root.SendMessage("t_Enter"); 19 DoorCtrl.t_Enter(); //親オブジェクトのメソッド呼び出し 20 Debug.Log("hoge01"); 21 } 22 } 23 24 void OnTriggerExit(Collider collider) 25 { 26 DoorCtrl.t_Exit(); //親オブジェクトのメソッド呼び出し 27 Debug.Log("hoge02"); 28 } 29}

投稿2016/10/19 09:40

aiueoao

総合スコア146

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

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

alb14laq

2016/10/19 11:05

丁寧な回答ありがとうございます!なんどもすみませんでした。無事、できるようになりました。大変お世話になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問