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

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

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

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

Unity

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

Q&A

0回答

622閲覧

unityでワープ機能をつけたいが、機能してくれない。

TIE_Atushi

総合スコア13

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/05/23 14:59

unityで3Dアクションゲームを作っています。
ギミックとして、ワープを作ろうと思ったのですがワープするエリアに入っても何も起きません。
キャラはユニティちゃんを使っています。
参考にしたサイトです。
https://gametukurikata.com/program/warp

あと、ユニティちゃんを移動させるスクリプトが2つ入れてるせいで直進しかできなくなっています。
``C#`
コード
public class WarpChara : MonoBehaviour{

public enum WarpCharaState { normal, goToWarpPoint, }; private CharacterController characterController; private Animator animator; private Vector3 velocity = Vector3.zero; private WarpCharaState state; private Transform waitPoint; private Transform warpPoint; private InstantiateParticle instantiateParticle; // 歩行速度 public float walkSpeed; // 旋回速度 public float rotateSpeed; // ワープポイントでキャラクターを中央に移動させたり回転させたりするスピード public float goToWaitPointSpeed; void Start(){ characterController = GetComponent<CharacterController>(); animator = GetComponent<Animator>(); state = WarpCharaState.normal; instantiateParticle = GetComponent<InstantiateParticle>(); Debug.Log("成功"); } void Update() { if (state == WarpCharaState.normal){ //if (characterController.isGrounded){ // velocity = Vector3.zero; // var input = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")); // if (input.magnitude > 0f){ // transform.LookAt(transform.position + input); // velocity += transform.forward * walkSpeed; // animator.SetFloat("Speed", 3f); // }else{ // animator.SetFloat("Speed", 0f); // } //} //velocity.y += Physics.gravity.y * Time.deltaTime; //characterController.Move(velocity * Time.deltaTime); }else if (state == WarpCharaState.goToWarpPoint){ GoToWarpWaitPoint(); } } void GoToWarpWaitPoint(){ if (Vector3.Distance(transform.position, waitPoint.position) > 0.1f || Quaternion.Angle(transform.rotation, waitPoint.rotation) >= 5f ){ animator.SetFloat("Speed", 3f); Debug.Log("移動中"); transform.position = Vector3.Lerp(transform.position, waitPoint.position, goToWaitPointSpeed * Time.deltaTime); transform.rotation = Quaternion.Lerp(transform.rotation, waitPoint.rotation, goToWaitPointSpeed * Time.deltaTime); }else if (transform.position != waitPoint.position){ animator.SetFloat("Speed", 0f); Debug.Log("きっちり位置と角度を合わせる"); transform.position = waitPoint.position; transform.rotation = waitPoint.rotation; // ワープ用パーティクルの表示 instantiateParticle.InstantiateWarpParticle(transform.position); // 3秒後にワープ Invoke("Warp", 3f); } } void Warp(){ transform.position = warpPoint.position; transform.rotation = warpPoint.rotation; // 移動先でワープパーティクルの表示 instantiateParticle.InstantiateWarpParticle(transform.position); SetState(WarpCharaState.normal); } public void SetState(WarpCharaState state, Transform waitPoint = null, Transform warpPoint = null){ this.state = state; this.waitPoint = waitPoint; this.warpPoint = warpPoint; if (state == WarpCharaState.goToWarpPoint){ velocity = Vector3.zero; } }

}

もう一つ元々ユニティちゃんに入れてあった移動スクリプトです。

(※見にくくてすいません。)

namespace UnityChan{

// 必要なコンポーネントの列記 [RequireComponent(typeof(Animator))] [RequireComponent(typeof(CapsuleCollider))] [RequireComponent(typeof(Rigidbody))] public class UnityChanControlScriptWithRgidBody : MonoBehaviour{ public float animSpeed = 1.5f;

// アニメーション再生速度設定
public float lookSmoother = 3.0f;
// a smoothing setting for camera motion
public bool useCurves = true;
// Mecanimでカーブ調整を使うか設定する
// このスイッチが入っていないとカーブは使われない
public float useCurvesHeight = 0.5f;
// カーブ補正の有効高さ(地面をすり抜けやすい時には大きくする)

// 以下キャラクターコントローラ用パラメタ // 前進速度 public float forwardSpeed = 7.0f; // 後退速度 public float backwardSpeed = 2.0f; // 旋回速度 public float rotateSpeed = 3.0f; // ジャンプ威力 public float jumpPower = 3.0f; // キャラクターコントローラ(カプセルコライダ)の参照 private CapsuleCollider col; private Rigidbody rb; // キャラクターコントローラ(カプセルコライダ)の移動量 private Vector3 velocity; // CapsuleColliderで設定されているコライダのHeiht、Centerの初期値を収める変数 private float orgColHight; private Vector3 orgVectColCenter; private Animator anim;

// キャラにアタッチされるアニメーターへの参照
private AnimatorStateInfo currentBaseState;
// base layerで使われる、アニメーターの現在の状態の参照

private GameObject cameraObject; // メインカメラへの参照 // アニメーター各ステートへの参照 static int idleState = Animator.StringToHash ("Base Layer.Idle"); static int locoState = Animator.StringToHash ("Base Layer.Locomotion"); static int jumpState = Animator.StringToHash ("Base Layer.Jump"); static int restState = Animator.StringToHash ("Base Layer.Rest"); // 初期化 void Start (){ // Animatorコンポーネントを取得する anim = GetComponent<Animator> (); // CapsuleColliderコンポーネントを取得する(カプセル型コリジョン) col = GetComponent<CapsuleCollider> (); rb = GetComponent<Rigidbody> (); //メインカメラを取得する cameraObject = GameObject.FindWithTag ("MainCamera"); // CapsuleColliderコンポーネントのHeight、Centerの初期値を保存する orgColHight = col.height; orgVectColCenter = col.center; } // 以下、メイン処理.リジッドボディと絡めるので、FixedUpdate内で処理を行う. void FixedUpdate (){ float h = Input.GetAxis ("Horizontal"); // 入力デバイスの水平軸をhで定義 float v = Input.GetAxis ("Vertical"); // 入力デバイスの垂直軸をvで定義 anim.SetFloat ("Speed", v); // Animator側で設定している"Speed"パラメタにvを渡す anim.SetFloat ("Direction", h); // Animator側で設定している"Direction"パラメタにhを渡す anim.speed = animSpeed; // Animatorのモーション再生速度に animSpeedを設定する currentBaseState = anim.GetCurrentAnimatorStateInfo (0); // 参照用のステート変数にBase Layer (0)の現在のステートを設定する rb.useGravity = true;//ジャンプ中に重力を切るので、それ以外は重力の影響を受けるようにする Debug.Log("成功"); // 以下、キャラクターの移動処理 velocity = new Vector3 (0, 0, v); // 上下のキー入力からZ軸方向の移動量を取得 // キャラクターのローカル空間での方向に変換 velocity = transform.TransformDirection (velocity); //以下のvの閾値は、Mecanim側のトランジションと一緒に調整する if (v > 0.1) { velocity *= forwardSpeed; // 移動速度を掛ける } else if (v < -0.1) { velocity *= backwardSpeed; // 移動速度を掛ける } if (Input.GetButtonDown ("Jump")) { // スペースキーを入力したら //アニメーションのステートがLocomotionの最中のみジャンプできる if (currentBaseState.nameHash == locoState) { //ステート遷移中でなかったらジャンプできる if (!anim.IsInTransition (0)) {

rb.AddForce (Vector3.up *jumpPower,ForceMode.VelocityChange);
anim.SetBool ("Jump", true);
// Animatorにジャンプに切り替えるフラグを送る
}
}
}

// 上下のキー入力でキャラクターを移動させる transform.localPosition += velocity * Time.fixedDeltaTime; // 左右のキー入力でキャラクタをY軸で旋回させる transform.Rotate (0, h * rotateSpeed, 0); // 以下、Animatorの各ステート中での処理 // Locomotion中 // 現在のベースレイヤーがlocoStateの時 if (currentBaseState.nameHash == locoState) { //カーブでコライダ調整をしている時は、念のためにリセットする if (useCurves) { resetCollider (); } } // JUMP中の処理 // 現在のベースレイヤーがjumpStateの時 else if (currentBaseState.nameHash == jumpState) { cameraObject.SendMessage ("setCameraPositionJumpView"); // ジャンプ中のカメラに変更 // ステートがトランジション中でない場合 if (!anim.IsInTransition (0)) { // 以下、カーブ調整をする場合の処理 if (useCurves) { // 以下JUMP00アニメーションについているカーブJumpHeightとGravityControl // JumpHeight:JUMP00でのジャンプの高さ(0〜1) // GravityControl:1⇒ジャンプ中(重力無効)、0⇒重力有効 float jumpHeight = anim.GetFloat ("JumpHeight"); float gravityControl = anim.GetFloat ("GravityControl"); if (gravityControl > 0) rb.useGravity = false; //ジャンプ中の重力の影響を切る // レイキャストをキャラクターのセンターから落とす Ray ray = new Ray (transform.position + Vector3.up, -Vector3.up); RaycastHit hitInfo = new RaycastHit (); // 高さが useCurvesHeight 以上ある時のみ、コライダーの高さと中心をJUMP00アニメーションについているカーブで調整する if (Physics.Raycast (ray, out hitInfo)) { if (hitInfo.distance > useCurvesHeight) { col.height = orgColHight - jumpHeight; // 調整されたコライダーの高さ float adjCenterY = orgVectColCenter.y + jumpHeight; col.center = new Vector3 (0,adjCenterY, 0);

// 調整されたコライダーのセンター
} else {
// 閾値よりも低い時には初期値に戻す(念のため)
resetCollider ();
}
}
}
// Jump bool値をリセットする(ループしないようにする)
anim.SetBool ("Jump", false);
}
}
// IDLE中の処理
// 現在のベースレイヤーがidleStateの時
else if (currentBaseState.nameHash == idleState) {
//カーブでコライダ調整をしている時は、念のためにリセットする
if (useCurves) {
resetCollider ();
}
// スペースキーを入力したらRest状態になる
if (Input.GetButtonDown ("Jump")) {
anim.SetBool ("Rest", true);
}
}
// REST中の処理
// 現在のベースレイヤーがrestStateの時
else if (currentBaseState.nameHash == restState) {
//cameraObject.SendMessage("setCameraPositionFrontView"); // カメラを正面に切り替える
// ステートが遷移中でない場合、Rest bool値をリセットする(ループしないようにする)
if (!anim.IsInTransition (0)) {
anim.SetBool ("Rest", false);
}
}
}

// キャラクターのコライダーサイズのリセット関数 void resetCollider (){ // コンポーネントのHeight、Centerの初期値を戻す col.height = orgColHight; col.center = orgVectColCenter; } }

説明不足な点がありましたらご意見ください。
2つあるスクリプトを一つにまとめたほうがよいのか悩んでいます。
まだUnityでゲーム開発はまだまもないのでご教授のほどよろしくお願いいたします。

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

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

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

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

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

sakura_hana

2019/05/24 01:45

・stateがWarpCharaState.goToWarpPointになる箇所が何処にも無いのですが、それが原因ではないでしょうか? ・ソースコードの前の行に「```C#」、後の行に「```」を付けてください。 ・Debug.Logがどこまで発動しているか記載してください。(原因の絞り込みが出来ます) ・「ワープさせる為のコード」と「移動させる為のコード」なので、別々のスクリプトでいいと思います(多分前者にワープ条件のコードも入って来るだろうし)。ただ「ワープ中は移動させない」という処理を何処かに組み込む必要があるかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問