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

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

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

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

Q&A

解決済

1回答

2090閲覧

左右に移動する床で transform.SetParent(col.gameObject.transform)しているのに滑ってしまう

kudo201810

総合スコア30

Unity3D

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

0グッド

0クリップ

投稿2020/08/19 22:06

左右に移動する床にキャラクターコントローラーで動くプレイヤーが乗ったときに
滑らないようにしたいのですが、どうしても滑ってしまいます。
バージョン:Unity 2019.2.11f1 (64-bit)

左右に動く床には、タグ:MoveFlowerを設定。

プレイヤーにつけたスクリプトは以下

using System.Collections; using System.Collections.Generic; using UnityEngine; public class FALLGUYS_Ctrl_src : MonoBehaviour { const string mvflower_tag = "MoveFlower"; public float speed = 7.0f; //移動する速さ public float rotateSpeed = 3.0f; //回転する速さ public float gravity = 9.8f; //重力の強さ public float jumpPower = 6.0f; //ジャンプのスピード private CharacterController cc; Vector3 direction; //シーソーに乗ったときに使用 public GameObject asimoto; // 床に与える力 [SerializeField] private float power = 1f; Animator anim; bool mvf_f = false; void Start() { cc = GetComponent<CharacterController>(); anim = GetComponent<Animator>(); } void Update() { if (cc.isGrounded) //CharacterControllerが接地している場合の処理 { // 回転 transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed, 0); //キャラクターのローカル空間での方向 direction = transform.transform.forward * Input.GetAxis("Vertical") * speed; //アニメーション if (Input.GetAxis("Vertical") > 0) { //走るアニメーション anim.SetBool("run_f", true); } else { //止まるアニメーション anim.SetBool("run_f", false); } if (Input.GetKeyDown("space")) //スペースキーが押されている場合 { direction.y = jumpPower; //Y方向への速度にジャンプのスピードを代入 //ジャンプアニメーション anim.SetTrigger("jump_f"); } } if (mvf_f == false) { // 下向き重力を加える direction.y -= gravity * Time.deltaTime; // Move関数で移動 cc.Move(direction * Time.deltaTime); } } void OnControllerColliderHit(ControllerColliderHit col) { // rayPositionから下にレイを飛ばし、Blockレイヤーに当たっていたら力を加える if (Physics.Linecast(asimoto.transform.position, asimoto.transform.position + Vector3.down, LayerMask.GetMask("Block"))) { //Debug.Log("addfoce"); col.gameObject.GetComponent<Rigidbody>().AddForceAtPosition(Vector3.down * power, transform.position, ForceMode.Force); } //左右に移動する床に接触した場合 if (col.gameObject.CompareTag(mvflower_tag)) { //左右に移動する床を親オブジェクトに設定し、一緒に移動するようにする transform.SetParent(col.gameObject.transform); mvf_f = true; } } void OnTriggerExit(Collider col) //オブジェクトが離れたとき { //左右に移動する床から離れたときの処理 transform.parent = null; mvf_f = false; } void OnTriggerStay(Collider col) //オブジェクトが触れている間 { //左右に移動する床に触れている間 if (col.gameObject.CompareTag(mvflower_tag)) { //OnControllerColliderHitだけだと左右にあまり動かなかったため mvf_f = true; } } }

プレイヤーが、動く床の子オブジェクトになっていることは確認できています。

キャラクターコントローラーを無効にすると、一緒に動くのですが
その後、なんの動作もできなくなってしまいます。

いろいろ調べたり、試したりしたのですが、どうしてもうまくいきません。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

動く床のスクリプトを以下を追加

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move_Flower_MoveTowards : MonoBehaviour { private bool mv_f = true; public float idou_x = 0f; private float x_tmp = 0.0f; float sumTime = 0; float duration = 3.0f; public float length = 0.2f; //床のスピード [SerializeField] private float speed = 100f; private Vector3 latestPos; //前回のPosition private Vector3 diff;    //方向 void Start() { x_tmp = transform.position.x; } void Update() { if (mv_f) { sumTime += Time.deltaTime; idou_x = x_tmp + Mathf.PingPong(sumTime * length / duration * 2, length); //1秒間に0からlengthまで1往復する例 transform.position = new Vector3(idou_x, transform.position.y, transform.position.z); diff = transform.position - latestPos; //前回からどこに進んだかをベクトルで取得 latestPos = transform.position; //前回のPositionの更新 } } // 床の動く速度を返す public Vector3 MoveFlower_Velocity() { return diff * speed; } }

プレイヤーの処理を以下に変更したたらできました。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class FALLGUYS_Ctrl_src : MonoBehaviour { const string mvflower_tag = "MoveFlower"; public float speed = 7.0f; //移動する速さ public float rotateSpeed = 3.0f; //回転する速さ public float gravity = 9.8f; //重力の強さ public float jumpPower = 6.0f; //ジャンプのスピード private CharacterController cc; Vector3 direction; //シーソーに乗ったときに使用 public GameObject asimoto; // 床に与える力 [SerializeField] private float power = 1f; Animator anim; bool mvf_f = false; // 動く床の動いていく方向 public Vector3 floorMoveDirection; void Start() { cc = GetComponent<CharacterController>(); anim = GetComponent<Animator>(); } void Update() { if (cc.isGrounded) //CharacterControllerが接地している場合の処理 { // 回転 transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed, 0); //キャラクターのローカル空間での方向 direction = transform.transform.forward * Input.GetAxis("Vertical") * speed; //アニメーション if (Input.GetAxis("Vertical") > 0) { //走るアニメーション anim.SetBool("run_f", true); } else { //止まるアニメーション anim.SetBool("run_f", false); } if (Input.GetKeyDown("space")) //スペースキーが押されている場合 { floorMoveDirection = Vector3.zero; direction.y = jumpPower; //Y方向への速度にジャンプのスピードを代入 //ジャンプアニメーション anim.SetTrigger("jump_f"); } } if (mvf_f) { //動く床乗っていたら力を加える direction += floorMoveDirection; } // 下向き重力を加える direction.y -= gravity * Time.deltaTime; // Move関数で移動 cc.Move(direction * Time.deltaTime); } void OnControllerColliderHit(ControllerColliderHit col) { // rayPositionから下にレイを飛ばし、Blockレイヤーに当たっていたら力を加える if (Physics.Linecast(asimoto.transform.position, asimoto.transform.position + Vector3.down, LayerMask.GetMask("Block"))) { //Debug.Log("addfoce"); col.gameObject.GetComponent<Rigidbody>().AddForceAtPosition(Vector3.down * power, transform.position, ForceMode.Force); } //左右に移動する床に接触した場合 if (col.gameObject.CompareTag(mvflower_tag)) { floorMoveDirection = col.gameObject.GetComponent<Move_Flower_MoveTowards>().MoveFlower_Velocity(); mvf_f = true; } } void OnTriggerExit(Collider col) //オブジェクトが離れたとき { //左右に移動する床から離れたときの処理 floorMoveDirection = Vector3.zero; mvf_f = false; } void OnTriggerStay(Collider col) //オブジェクトが触れている間 { //左右に移動する床に触れている間 if (col.gameObject.CompareTag(mvflower_tag)) { //OnControllerColliderHitだけだと左右にあまり動かなかったため mvf_f = true; } } }

投稿2020/08/19 23:52

kudo201810

総合スコア30

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問