前提・実現したいこと
charactercontrollerのついたオブジェクトが左右に動く床に乗ったとき、transform.SetParentで同方向に移動させる。
発生している問題・エラーメッセージ
charactercontrollerがついてないオブジェクトはtransform.SetParentで親子移動できたのですが、charactercontrollerがついてしまうと親子移動せずに落ちてしまいます。
下記**[プレイヤーが床に乗ったときに子にするコード]**で床の子要素になっているところまでは確認できています。
■追記です。
最小構成で新規にプロジェクトを作り直してみました。使っていたパーツはそのままです。
以下のページにそのプロジェクトファイルをzipにしておいてあります。もし、見て頂ける方がおられましたらお願いします。
https://firestorage.jp/download/483c6e64f7fc36f536d971df2f2ca914e4b77e59
該当のソースコード
[動く床側のコード]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveFloor : MonoBehaviour
{
public float moveState;
public float speed;
Vector3 vector;
// Start is called before the first frame update void Start() { vector = transform.localPosition; } // Update is called once per frame void Update() { float x = moveState * Mathf.Sin(Time.time * speed); transform.localPosition = vector + new Vector3(x, 0, 0); }
}
[プレイヤーが床に乗ったときに子にするコード]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveFloorPlayer : MonoBehaviour
{
private CharacterController controller;
// Start is called before the first frame update void Start() { controller = GetComponent<CharacterController>(); } // Update is called once per frame void Update() { } //void OnCollisionEnter(Collision col) void OnControllerColliderHit(ControllerColliderHit hit) { if (hit.gameObject.tag == "MoveFloor") { transform.SetParent(hit.transform); } }
}
[プレイヤーを操作するコード]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
public float rotate;
public float speedup;
private CharacterController characterController; //CharacterControllerの機能を使うためにcharacterControllerという変数を作成
private Vector3 Velocity; //CharacterControllerを動かすためのVector3型の変数を作成
[SerializeField] private float jumpPower; //ジャンプ力を入れるための変数 [SerializeField] private float moveSpeed; //移動スピードを入れるための変数 // Start is called before the first frame update void Start() { characterController = GetComponent<CharacterController>(); //characterControllerにCharacterControllerを代入する } // Update is called once per frame void Update() { characterController.Move(Velocity); //characterControllerをVelocity動かす if (Input.GetKey(KeyCode.W)) { characterController.Move(this.gameObject.transform.forward * moveSpeed * Time.deltaTime); } if (Input.GetKey(KeyCode.S)) { characterController.Move(this.gameObject.transform.forward * -1f * moveSpeed * Time.deltaTime); } if (Input.GetKey(KeyCode.A)) { characterController.Move(this.gameObject.transform.right * -1 * moveSpeed * Time.deltaTime); } if (Input.GetKey(KeyCode.D)) { characterController.Move(this.gameObject.transform.right * moveSpeed * Time.deltaTime); } characterController.Move(Velocity * Time.deltaTime); //characterControllerをVelocity * 時間の経過分動かす Velocity.y += Physics.gravity.y * Time.deltaTime/20; if (characterController.isGrounded) //もしcharacterControllerが地面に着いていたら { if (Input.GetKey(KeyCode.Space)) //もしSpaceキーがおされたら { Velocity.y = jumpPower; } } }
}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/17 11:44