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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

6669閲覧

生成したオブジェクトを、徐々に大きくしていきたいのですがうまくいきませんでした。。。

YukiKuzira

総合スコア18

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2019/01/31 16:28

前提・実現したいこと

現在RPGを作ろうとしていて、そのゲーム内の演出で勇者が生成した光のエネルギーを徐々に大きくして、正面の敵に向かって打ち出すようにしたいのです。それで、光の生成まではうまくいったのですが、徐々に大きくするという部分がうまくいきません。生成したオブジェクトを少しずつ大きくさせる方法をご教授いただきたくお願い申し上げますm(_ _;)m

該当のソースコード(C#)

/-------------------------------------------------------------
//BraveのRangedAtttack(遠隔攻撃)にて、光のエネルギーを発生させるスクリプト
-------------------------------------------------------------
/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BraveShoot : MonoBehaviour
{
//生成する光エネルギーエフェクト
[SerializeField] private GameObject LightShoot;

//LightShot生成のためのTransform設定 [SerializeField] private Vector3 LightShootPosition = new Vector3(0f, 0f, 0f); [SerializeField] private Vector3 LightShootRotation = new Vector3(0f, 0f, 0f); [SerializeField] private Vector3 LightShootScale = new Vector3(1.0f, 1.0f, 1.0f); //ShotエフェクトのScale変更用 [SerializeField] private float LightSpeed; // 光エネルギー変化のスピード [SerializeField] private float maxSpeed; // 最高速度 [SerializeField] private Vector3 LightScale; // 光エネルギーの目標Scale private GameObject Energy; private float LightVelocity; // 光エネルギー変化用の現在の速度 private float startTime; // 開始時間 bool EnergyCharge = false; // Update is called once per frame void Update() { if (EnergyCharge == true) { //生成した光のエネルギーを徐々に大きくする。 var Scale_x = Mathf.SmoothDamp(LightShoot.transform.localScale.x, LightScale.x, ref LightVelocity, LightSpeed * Time.deltaTime, maxSpeed); var Scale_y = Mathf.SmoothDamp(LightShoot.transform.localScale.y, LightScale.y, ref LightVelocity, LightSpeed * Time.deltaTime, maxSpeed); var Scale_z = Mathf.SmoothDamp(LightShoot.transform.localScale.z, LightScale.z, ref LightVelocity, LightSpeed * Time.deltaTime, maxSpeed); LightShootScale.x = Scale_x; LightShootScale.y = Scale_y; LightShootScale.z = Scale_z; } } public void ShootEffect() { //エフェクトの生成する位置を設定。 Vector3 position = new Vector3(LightShootPosition.x, LightShootPosition.y, LightShootPosition.z); //エフェクトの生成する角度を設定。 Vector3 rotation = new Vector3(LightShootRotation.x, LightShootRotation.y, LightShootRotation.z); //上記の位置と角度でエフェクトを生成。 GameObject effectPlayer = (GameObject)Instantiate(LightShoot, position, Quaternion.Euler(rotation)); //生成したエフェクトを子オブジェクトにする。 effectPlayer.transform.parent = transform; //生成したエフェクトのScaleを「LightShotScale」に変更する effectPlayer.transform.localScale = LightShootScale; EnergyCharge = true; }

}

試したこと

Mathf.SmoothDampを使えば、値を徐々に変化させられるという記事を見つけたので、今回初めて大きさを変える部分に組み込んでみたのですが、うまくいっていないようです(?_?)
スクリプトの書き方が悪いのか、Inspector側の設定が悪いのかと悶々としております。
現在のInspectorをキャプチャして保存しましたので、貼らせていただきます。

イメージ説明

どなたかこの件について解決案がございましたら、教えていただけると幸いです。
何卒よろしくお願いいたします (≧人≦)

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

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

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

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

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

m.ts10806

2019/01/31 21:39

コードはマークダウンのcode機能を利用してご提示ください
guest

回答1

0

ベストアンサー

いくつか問題がありそうだと思った箇所について下記のようにしてみましたが、いかがでしょうか?

C#

1/*------------------------------------------------------------- 2//BraveのRangedAtttack(遠隔攻撃)にて、光のエネルギーを発生させるスクリプト 3-------------------------------------------------------------*/ 4using System.Collections; 5using System.Collections.Generic; 6using UnityEngine; 7 8public class BraveShoot : MonoBehaviour 9{ 10 //生成する光エネルギーエフェクト 11 [SerializeField] private GameObject LightShoot; 12 13 //LightShot生成のためのTransform設定 14 [SerializeField] private Vector3 LightShootPosition = new Vector3(0f, 0f, 0f); 15 [SerializeField] private Vector3 LightShootRotation = new Vector3(0f, 0f, 0f); 16 [SerializeField] private Vector3 LightShootScale = new Vector3(1.0f, 1.0f, 1.0f); 17 18 //ShotエフェクトのScale変更用 19 20 // 拡大するスピードはSmoothDampによって制御されているので、設定値としては「スピード」ではなく 21 // 「光が発生してから目標サイズに到達するまでの秒数」としてみました 22 // LightTimeを小さくしても、maxSpeedが小さいままだと目標時間で目標スケールに到達できない可能性がありますのでご注意ください 23 [SerializeField] private float LightTime; 24 // [SerializeField] private float LightSpeed; // 光エネルギー変化のスピード 25 26 [SerializeField] private float maxSpeed; // 最高速度 27 [SerializeField] private Vector3 LightScale; // 光エネルギーの目標Scale 28 29 // 当初のコードでは、プレハブの側のスケールをいじっているようです 30 // 一般的には、プレハブ側ではなく生成されたインスタンス側をいじる方がいいように思います 31 // そこで、この使っていない「Energy」をインスタンス格納用に使用することにしました 32 private GameObject Energy; 33 34 // Update内ではスケールXYZをバラバラにSmoothDampで変化させていますが、ということは 35 // X、Y、Zの目標値もバラバラになる可能性があるのでしょうか? 36 // だとすると、速度もX、Y、Zそれぞれ用意してやる方がいいでしょう 37 // さもないと、X軸のSmoothDampで求めた速度が後続するY軸のSmoothDampにより上書きされてしまい 38 // 計算が狂ってしまうかと思います(YとZについても同様) 39 // そこで、LightVelocityをVector3に変えてみました 40 private Vector3 LightVelocity; // 光エネルギー変化用の現在の速度 41 private float startTime; // 開始時間 42 43 bool EnergyCharge = false; 44 45 // Update is called once per frame 46 void Update() 47 { 48 if (EnergyCharge == true) 49 { 50 //生成した光のエネルギーを徐々に大きくする。 51 // SmoothDampの「current」にEnergyの各スケールを、「smoothTime」にLightTimeを使用するよう変更し、速度も各軸バラバラにする 52 var Scale_x = Mathf.SmoothDamp(Energy.transform.localScale.x, LightScale.x, ref LightVelocity.x, LightTime, maxSpeed); 53 var Scale_y = Mathf.SmoothDamp(Energy.transform.localScale.y, LightScale.y, ref LightVelocity.y, LightTime, maxSpeed); 54 var Scale_z = Mathf.SmoothDamp(Energy.transform.localScale.z, LightScale.z, ref LightVelocity.z, LightTime, maxSpeed); 55 var Scale = new Vector3(Scale_x, Scale_y, Scale_z); 56 57 // スケールの設定先もEnergyにする 58 // LightShootScale.x = Scale_x; 59 // LightShootScale.y = Scale_y; 60 // LightShootScale.z = Scale_z; 61 Energy.transform.localScale = Scale; 62 63 // あるいは、XYZをまとめて計算してもいいでしょう 64 // 実は各軸バラバラに計算したときとは異なる結果になるのですが 65 // 見た目はすっきりするかと思います 66 /* 67 var Scale = Vector3.SmoothDamp(Energy.transform.localScale, LightScale, ref LightVelocity, LightTime, maxSpeed); 68 Energy.transform.localScale = Scale; 69 */ 70 71 // 新しいスケールがLightScaleに到達したら拡大完了と判断し、EnergyChargeをfalseに切り替える 72 // このタイミングを引き金にして、光エフェクトの動きを次の段階へ進める(敵の方へ飛ばす?)のがいいかと思います 73 // あるいは、エフェクト発生時点からの時間を測定して、それがLightTimeに到達したら切り替え...というのもありでしょう 74 if (Scale == LightScale) 75 { 76 Debug.Log("Energy charged"); 77 Energy.transform.localScale = LightScale; 78 EnergyCharge = false; 79 } 80 } 81 } 82 83 public void ShootEffect() 84 { 85 //エフェクトの生成する位置を設定。 86 Vector3 position = new Vector3(LightShootPosition.x, LightShootPosition.y, LightShootPosition.z); 87 //エフェクトの生成する角度を設定。 88 Vector3 rotation = new Vector3(LightShootRotation.x, LightShootRotation.y, LightShootRotation.z); 89 90 // 生成したインスタンスをローカル変数ではなくEnergyに保持するよう変更 91 //上記の位置と角度でエフェクトを生成。 92 Energy = (GameObject)Instantiate(LightShoot, position, Quaternion.Euler(rotation)); 93 94 //生成したエフェクトを子オブジェクトにする。 95 Energy.transform.parent = transform; 96 97 //生成したエフェクトのScaleを「LightShotScale」に変更する 98 Energy.transform.localScale = LightShootScale; 99 100 EnergyCharge = true; 101 } 102}

投稿2019/01/31 21:53

Bongo

総合スコア10807

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

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

YukiKuzira

2019/02/01 12:01

イメージどおりの挙動となりましたv(*≧∀≦*)v なかなかカッコいい仕上がりになりました♪ 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問