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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

1959閲覧

親オブジェクトの角度が変わると、子オブジェクトの生成位置がずれてしまいます(180°で反転)

YukiKuzira

総合スコア18

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/02/02 16:58

前提・実現したいこと

キャラクターの斬撃に合わせて、パーティクルを発動するスクリプトを作成しましたが、一通り作成したところで不具合を発見。親オブジェクト(キャラ)を回転させたとき、生成したパーティクルがInspector上で設定した地点とズレてしまい、親オブジェクトをY軸に180°回転させたところ、生成位置が反転してしまいました。
どうか、親オブジェクトの向きが変わっても、Inspector上で設定した地点に生成させる方法をご教授いただけると幸いでございます。何卒よろしくお願い致します (≧人≦○)

該当のソースコード

C#

1/*------------------------------------------------------------- 2//BraveのInAttackにて、剣の起動に合わせて斬撃エフェクトを生成 3-------------------------------------------------------------*/ 4using System.Collections; 5using System.Collections.Generic; 6using UnityEngine; 7 8public class BraveSlash : MonoBehaviour 9{ 10//◆◆◆ エフェクト生成用 ◆◆◆// 11 //生成するSlashエフェクト 12 [SerializeField] private GameObject LightSlash; 13 private GameObject Slash; //「Slash」をインスタンス格納用に使用 14 private GameObject Slash02; //「Slash02」をインスタンス格納用に使用 15 16 //LightSlash生成のためのTransform設定 17 [SerializeField] private Vector3 LightSlashPosition = new Vector3(0f, 0f, 0f); 18 [SerializeField] private Vector3 LightSlashRotation = new Vector3(0f, 0f, 0f); 19 [SerializeField] private Vector3 LightSlashScale = new Vector3(1.0f, 1.0f, 1.0f); 20 21 //LightSlash02生成のためのTransform設定 22 [SerializeField] private Vector3 LightSlashPosition02 = new Vector3(0f, 0f, 0f); 23 [SerializeField] private Vector3 LightSlashRotation02 = new Vector3(0f, 0f, 0f); 24 [SerializeField] private Vector3 LightSlashScale02 = new Vector3(1.0f, 1.0f, 1.0f); 25 26 public void SlashEffect() //MeleeAttack1撃目 27 { 28 //生成したエフェクトの大きさを設定。 29 LightSlash.transform.localScale = LightSlashScale; 30 31 //エフェクトの生成する位置を設定。 32 Vector3 position = new Vector3(LightSlashPosition.x, LightSlashPosition.y, LightSlashPosition.z); 33 //エフェクトの生成する角度を設定。インスペクター上から設定できるのはX・Z軸のみ。 34 Vector3 rotation = new Vector3(LightSlashRotation.x, this.transform.eulerAngles.y, LightSlashRotation.z); 35 36 //上記の位置と角度でエフェクトを生成。 37 Slash = (GameObject)Instantiate(LightSlash, position, Quaternion.Euler(rotation)); 38 39 //生成したエフェクトのlocalPositionを「LightSlashPosition」に変更する 40 //Slash.transform.localPosition = LightSlashPosition; 41 42 //生成したエフェクトを子オブジェクトにする。 43 Slash.transform.parent = transform; 44 } 45 46 public void SlashEffect02() //MeleeAttack2撃目 47 { 48 //生成したエフェクトの大きさを設定。 49 LightSlash.transform.localScale = LightSlashScale02; 50 51 //生成したエフェクトのlocalPositionを「LightSlashPosition02」に変更する 52 LightSlash.transform.localPosition = LightSlashPosition02; 53 54 //エフェクトの生成する位置を設定。インスペクター上からの設定が反映させるのはY軸のみ。 55 Vector3 position02 = new Vector3(LightSlashPosition02.x, LightSlashPosition02.y, LightSlashPosition02.z); 56 //エフェクトの生成する角度を設定。インスペクター上から設定できるのはX・Z軸のみ。 57 Vector3 rotation02 = new Vector3(LightSlashRotation02.x, this.transform.eulerAngles.y, LightSlashRotation02.z); 58 59 //上記の位置と角度でエフェクトを生成。 60 Slash02 = (GameObject)Instantiate(LightSlash, position02, Quaternion.Euler(rotation02)); 61 62 //生成したエフェクトのlocalPositionを「LightSlashPosition02」に変更する 63 //Slash02.transform.localPosition = LightSlashPosition02; 64 65 //生成したエフェクトを子オブジェクトにする。 66 Slash02.transform.parent = transform; 67 } 68 69 public void SlashDestroy() //生成したMeleeAttackを削除 70 { 71 //すべての子オブジェクトを削除する 72 foreach (Transform child in gameObject.transform) 73 { Destroy(child.gameObject); } 74 } 75}

詳細

【Inspector生成用設定】
イメージ説明

【通常(BraveMan(キャラ)Rotation.y = 0°)】
イメージ説明
イメージ説明

【位置ズレ(BraveMan(キャラ)Rotation.y = 180°)】
イメージ説明
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

インスペクタ上で設定するエフェクトの位置・回転角の解釈の仕方を変えて、親(スクリーンショットを見るにMeleeAttackでしょうか)に対する相対位置・相対回転と見なすのはどうでしょうか?

ご提示のコードではエフェクトのY軸周り角度として親オブジェクトのY軸周り角度を使用していますが、これを0に変えた上で、さらに生成されたエフェクトを自身の子にする際に、parentへのTransform代入ではなくSetParentを使ってみてはいかがでしょう。SetParentの場合、第2引数worldPositionStaysfalseに設定することでローカル位置・回転が維持されるようになるはずです。

位置・回転の解釈が変わるため、正しい位置にエフェクトを発生させるにはインスペクタの位置・回転設定を調整しなおす必要があるかもしれません。

C#

1 public void SlashEffect() //MeleeAttack1撃目 2 { 3 //生成したエフェクトの大きさを設定。 4 LightSlash.transform.localScale = LightSlashScale; 5 6 //エフェクトの生成する位置を設定。 7 Vector3 position = new Vector3(LightSlashPosition.x, LightSlashPosition.y, LightSlashPosition.z); 8 //エフェクトの生成する角度を設定。インスペクター上から設定できるのはX・Z軸のみ。 9 Vector3 rotation = new Vector3(LightSlashRotation.x, 0.0f, LightSlashRotation.z); 10 11 //上記の位置と角度でエフェクトを生成。 12 Slash = (GameObject)Instantiate(LightSlash, position, Quaternion.Euler(rotation)); 13 14 //生成したエフェクトのlocalPositionを「LightSlashPosition」に変更する 15 //Slash.transform.localPosition = LightSlashPosition; 16 17 //生成したエフェクトを子オブジェクトにする。 18 Slash.transform.SetParent(transform, false); 19 }

投稿2019/02/02 21:52

Bongo

総合スコア10807

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

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

YukiKuzira

2019/02/03 08:21

無事思い通りの挙動となり、とても勉強になりました___φ(。_。*)カキカキ エフェクトの位置は調整無しで良さそうでした♪ 助けていただき、誠にありがとうございました(/o^∀^o)/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問