Unityで2Dプラットフォーマーを作成していて、プレーヤーを移動するプラットフォームにとどまらせようとしています。私は今1日か2日検索といじくり回しをしました、そして私は運がありません。
基本的に、私はキャラクターが触れているときにプラットフォームと一緒にキャラクターを動かし続けるように努めるように言われました。まず、OnTriggerEnter()に関連するものを使用すると、プレーヤーはプラットフォームを直接通過します。OnCollisionEnter()(プレーヤーにCharacterController、プラットフォームにBoxColliderを使用)を実行しても、何も起こりません。これらは私が最も示唆していると思った2つのことです。もう1つは、プレーヤーをプラットフォームで育てることですが、これは明らかに「問題」を引き起こします(頻繁に述べられ、説明されることはありません)。
では、どうすればプレーヤーを移動するプラットフォームにとどまらせることができますか?移動プラットフォームのコードは次のとおりです。
public class MovingPlatform : MonoBehaviour
{
private float useSpeed;
public float directionSpeed = 9.0f;
float origY;
public float distance = 10.0f;
// Use this for initialization
void Start ()
{
origY = transform.position.y;
useSpeed = -directionSpeed;
}
// Update is called once per frame
void Update ()
{
if(origY - transform.position.y > distance)
{
useSpeed = directionSpeed; //flip direction
}
else if(origY - transform.position.y < -distance)
{
useSpeed = -directionSpeed; //flip direction
}
transform.Translate(0,useSpeed*Time.deltaTime,0);
}
そして、これがプレイヤーの動きのコードです(アップデート):
CharacterController controller = GetComponent<CharacterController>();
float rotation = Input.GetAxis("Horizontal");
if(controller.isGrounded)
{
moveDirection.Set(rotation, 0, 0); //moveDirection = new Vector3(rotation, 0, 0);
moveDirection = transform.TransformDirection(moveDirection);
//running code
if(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) //check if shift is held
{ running = true; }
else
{ running = false; }
moveDirection *= running ? runningSpeed : walkingSpeed; //set speed
//jump code
if(Input.GetButtonDown("Jump"))
{
//moveDirection.y = jumpHeight;
jump ();
}
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
編集:それは私がプレーヤーとプラットフォームをどのように定義しているかに関係しているかもしれないと思いますが、私はさまざまな組み合わせを試しました。プラットフォームが(コライダーの)トリガーである場合、プレーヤーは一貫してそれを通過します。そうでない場合、OnTrigger関数を使用できません。プレーヤーとプラットフォームの両方に剛体を取り付けていますが、何の影響も受けていないようです。プレイヤーがいくつかのセットアップでプラットフォームに乗るとき、彼はジッターし、しばしばただ失敗してしまいます。