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

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

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

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

Q&A

2回答

1310閲覧

生成位置が変わらない。親子関係が解除できない。

GOTOken

総合スコア54

Unity

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

0グッド

0クリップ

投稿2018/05/12 09:19

Unity2D

全体プログラム

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5 6public class Player : MonoBehaviour { 7 8 public float jumpPower;//Player跳躍力変数 9 public float DestroyTsumikiTimer;//積み木削除時間計測用変数 10 public GameObject tsumikiPrefabs;//積み木Prefabs格納 11 public Vector2 tsumikiGeneratePosition= new Vector2();//積み木生成位置 12 13 private Rigidbody2D rg2d;//コンポーネント取得用変数 14 public float speed ; 15 private float moveX; 16 private float moveY; 17 private Rigidbody2D rb; 18 // Use this for initialization 19 void Start() 20 { 21 rb = GetComponent<Rigidbody2D>(); 22 } 23 24 private void Update() 25 { 26 moveX = Input.GetAxis("Horizontal") * speed; 27 //移動時左右反転 28 Vector3 scale = transform.localScale; 29 if(moveX >= 0) 30 { 31 scale.x = -4;//右向き 32 } 33 else 34 { 35 scale.x = 4;//左向き 36 } 37 transform.localScale = scale; 38 39 moveY = Input.GetAxis("Vertical") * speed; 40 Vector3 direction = new Vector2(moveX, 0); 41 } 42 43 private void FixedUpdate() 44 { 45 rb.velocity = new Vector3(moveX, 0); 46 //関数呼び出し 47 tsumiki(); 48 49 } 50 private void tsumiki() 51 { 52 var P_pos = transform.localPosition.x; 53 54 // Spaceキーを入力されたら、積み木Prefabを複製する。 55 if (Input.GetKeyDown(KeyCode.Space)) 56 { 57 Vector2 position = transform.position + transform.up * tsumikiGeneratePosition.y + transform.forward * tsumikiGeneratePosition.x; 58 GameObject tsumikiObj = Instantiate(tsumikiPrefabs, this.transform.localPosition, Quaternion.identity); //積み木Prefabの複製 59 60 61 62 //Spaceキーを入力している間は、Playerと親子関係。 63 if (Input.GetKey(KeyCode.Space)){ 64 65    var Tsumiki_Pos = transform.localPosition;//Player座標取得 66 67 tsumikiObj.transform.parent = GameObject.Find("Player").transform;//積み木Prefabを親子関係に 68 Debug.Log("くっついた!"); 69 70 // Spaceキーを離したときに、親子関係を解除し、ひとつのブロックとして扱う 71 if (Input.GetKeyUp(KeyCode.Space)) 72 { 73 transform.parent = null;//親子関係解除 74 Debug.Log("解除"); 75 } 76 //数秒経つと積み木Objが破棄される。 77 //Destroy(tsumikiObj, DestroyTsumikiTimer);//積み木Destroy and 時間計測 78   } 79 80 } 81 82 } 83} 84

###** わからないこと**

C#

1 public Vector2 tsumikiGeneratePosition= new Vector2();

と宣言し、Inspector側で(1,0)と入れた。が、反映されずPlayerの中心部分に生成されたこと。

C#

1 moveX = Input.GetAxis("Horizontal") * speed; 2 //移動時左右反転 3 Vector3 scale = transform.localScale; 4 if(moveX >= 0) 5 { 6 scale.x = -4;//右向き 7 } 8 else 9 { 10 scale.x = 4;//左向き 11 } 12 transform.localScale = scale; 13

ここでSpriteの反転の処理を入れたが、入力の後に強制的に最初の向きに変わってしまう

C#

1 private void tsumiki() 2 { 3 var P_pos = transform.localPosition.x; 4 5 // Spaceキーを入力されたら、積み木Prefabを複製する。 6 if (Input.GetKeyDown(KeyCode.Space)) 7 { 8 Vector2 position = transform.position + transform.up * tsumikiGeneratePosition.y + transform.forward * tsumikiGeneratePosition.x; 9 GameObject tsumikiObj = Instantiate(tsumikiPrefabs, this.transform.localPosition, Quaternion.identity); //積み木Prefabの複製 10 11 12 13 //Spaceキーを入力している間は、Playerと親子関係。 14 if (Input.GetKey(KeyCode.Space)){ 15 16    var Tsumiki_Pos = transform.localPosition;//Player座標取得 17 18 tsumikiObj.transform.parent = GameObject.Find("Player").transform;//積み木Prefabを親子関係に 19 Debug.Log("くっついた!"); 20 21 // Spaceキーを離したときに、親子関係を解除し、ひとつのブロックとして扱う 22 if (Input.GetKeyUp(KeyCode.Space)) 23 { 24 transform.parent = null;//親子関係解除 25 Debug.Log("解除"); 26 } 27 //数秒経つと積み木Objが破棄される。 28 //Destroy(tsumikiObj, DestroyTsumikiTimer);//積み木Destroy and 時間計測 29   } 30 31 } 32 33 }

複製され、親子関係にするという処理までは通っているのにそこからの、if文が通らない理由

実装したいこと

・Spriteが反転してもそのままにしておきたい。
・複製の先の場所をPlayerの対して正面に出るようにしたい
・親子関係にした後にキーを離したら解除できるようにしたい。

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

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

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

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

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

guest

回答2

0

transform.parent = null;//親子関係解除
ここの行も
tsumikiObj.transform.parent = null;
こうですね。

ちなみに生成後のオブジェクトの位置や大きさを変えたい場合も
transform.localScale = scale;ではなく
tsumikiObj.transform.localScale = scale;です。
(前の質問でも記載しましたが「前に何も付いていないtransform」は「このスクリプトが付いているオブジェクトのtransform」です。)


それはそれとして、現在のコードだとInput.GetKeyUp(KeyCode.Space)のif文に入らないです。
「GetKeyDown」は押された瞬間、「GetKey」は押されている間、「GetKeyUp」は離された瞬間なので
「GetKeyDownかつGetKeyUp」は(ほぼ)絶対にfalseです。(1フレーム以内に押して離した場合のみtrueになります)

全体的にソースコードの修正が必要なので、かいつまんで記載します。

C#

1public class TsumikiMake : MonoBehaviour { 2 //クラス変数にしておく 3 private GameObject tsumikiObj; 4 5 private void tsumiki() { 6 //スペースキーが押された瞬間 7 if (Input.GetKeyDown(KeyCode.Space)) { 8 Vector2 position = 〜〜〜; 9 tsumikiObj = Instantiate(〜〜〜); 10 11 //生成時点で親子化すれば「押されている間」の考慮は要らない 12 tsumikiObj.transform.parent = GameObject.Find("Player").transform; 13 14 //スペースキーが離された瞬間(同フレームで押して離された時に備えてelse ifにする) 15 } else if (Input.GetKeyUp(KeyCode.Space)){ 16 //親子関係解除 17 tsumikiObj.transform.parent = null; 18 } 19 } 20} 21

ちなみに。
tsumikiObj = Instantiate(tsumikiPrefabs, GameObject.Find("Player").transform);
とやると、生成時点で「tsumikiObjはPlayerの子」となります(親の(0,0,0)位置に生成される)。
今回は結局その後位置調整が必要だと思いますが、覚えておくと便利かと。

投稿2018/05/13 01:01

編集2018/05/13 01:01
sakura_hana

総合スコア11427

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

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

0

C#

1 Vector2 position = transform.position + transform.up * tsumikiGeneratePosition.y + transform.forward * tsumikiGeneratePosition.x; 2 GameObject tsumikiObj = Instantiate(tsumikiPrefabs, position, Quaternion.identity); //積み木Prefabの複製

に変更したところ、生成位置の変更の実装に成功した。

投稿2018/05/12 09:33

GOTOken

総合スコア54

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問