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

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

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

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

Unity

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

Q&A

解決済

2回答

8348閲覧

剣の攻撃判定について

horitomo

総合スコア26

C#

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

Unity

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

1グッド

3クリップ

投稿2016/07/27 16:18

編集2016/07/28 17:46

すみません、質問させてください。

3Dキャラに剣を持たせて振った時だけ、攻撃判定が出るようにしたいです。

現状、剣を持たせてenemyタグのcolliderに剣にcomponentした剣タグのcolliderが接触した場合に
damege()を呼び出すように設定しています。
つまり、持っているだけの剣に敵が接触してもdamege()が呼び出されてしまいます。

これに対して、剣colliderをプレハブ化して、攻撃中のみ剣の位置にspawnさせるという様にするのが良いのでしょうか??

初歩的な質問で申し訳ないですがよろしくおねがいします。
スクリプトはC♯で返答いただけるとありがたいです。

(**以下、追記)

C#

1 2 3public class Mycontrol : MonoBehaviour {//自キャラコントロールスクリプト 4CharacterController characterController; 5 public GameObject Sw_Qb = null;//攻撃判定用キューブ 6 public GameObject Sw_Qb_POS = null;//攻撃判定用キューブの生成される位置の親のオブジェクト(この場合は、剣) 7//(中略) 8 void Attack() { MakeCollider(); }//Attackアニメーションのイベント→当たり判定を呼び出す(スクリプト的には意味ないけど一応書く) 9 void MakeCollider() { GameObject.Instantiate(Sw_Qb, Sw_Qb_POS.transform.position, Quaternion.identity); //攻撃判定用のCubeCollider生成 10}

C#

1public class Wepon : MonoBehaviour//Sw_Qbのプレハブに追加 2 3{ 4 public int Power = 50; //攻撃力 5 private float time = 0; 6 public float interbal =0.5f; //攻撃判定残留時間 7 8 // Use this for initialization 9 // Update is called once per frame 10 void Update() 11 { 12 time += Time.deltaTime; 13 if (time > interbal) { Destroy(this.gameObject); } 14 15 16 17 } 18 void OnTriggerEnter(Collider col)//ぶつかった時実行 19 { 20 21 22 if (col.gameObject.tag == "Enemy")//Enemyとだったら 23 { 24 col.gameObject.SendMessage("Damage", Power);//ダメージを与える 25 col.gameObject.SendMessage("sw_ef");//斬撃エフェクトを与える 26 27 } 28 }

これで何とか動作しました!!

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

Unityではアニメーションの指定のタイミングにEventを設定することが出来ます。
そしてそのEventをスクリプトで取得することが出来ます。
アニメーションイベントの使用

アニメーションデータを持つFBXファイルなどには、Animationの項目があります。
その中のEventsの項目で指定したフレーム位置にEventを設定できます。
イメージ説明

Animatiorと同じGameObjectにEventをキャッチするコンポーネントをアタッチすればEventを取得できます。

以下の例では3つのイベントをキャッチしています。
イメージ説明
イメージ説明

csharp

1using UnityEngine; 2 3public class TestAnimation : MonoBehaviour 4{ 5 [SerializeField] 6 private GameObject m_object = null; 7 8 public void OnEnableBlock() 9 { 10 m_object.SetActive( true ); 11 } 12 13 public void OnDisableBlock() 14 { 15 m_object.SetActive( false ); 16 } 17 18 public void OnSetBlockHeight( float i_height ) 19 { 20 m_object.transform.position = Vector3.up * i_height; 21 } 22 23} // class TestAnimation

イメージ説明

ご参考になればと思います。

投稿2016/07/27 22:03

urahimono

総合スコア714

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

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

horitomo

2016/07/28 06:57

ありがとうございます!!助かりました。 何とか教えていただいた事を使って変えてみたら、うまく動作できました。 編集後のスクリプトを追記しておきます。 何分、素人なので泥臭くなっちゃってます。 こーした方がもっと便利だよ!とかあればご教授ください。
guest

0

そーいうあたり判定は、基本的に判定データをモーションに紐づけ、1フレーム単位で On/Off できるようにシステム構築すべきだと思います。

剣なら、振った時に残像みたいなものもエフェクトで出るかと思いますが、残像込みで判定したい場合、大きな四角で攻撃判定を発生させればいいわけです。

投稿2016/07/27 17:52

mugicya

総合スコア1046

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

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

horitomo

2016/07/27 18:41

すみません、モーションに紐づけが具体的にわからないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問