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

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

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

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

Unity3D

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

受付中

なんでこれでInput System が動くねん!

pimen
pimen

総合スコア0

C#

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

Unity3D

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

1回答

-9評価

0クリップ

411閲覧

投稿2022/08/03 04:39

前提

C#初心者がUnityで3Dゲームを作っています。ジャンプと移動を実装するときにInputSystemを使いたいのですがスクリプトの書き方がわからずこのサイトhttps://jmpelletier.com/ja/unity%e3%81%a7%e4%b8%89%e4%ba%ba%e7%a7%b0%e8%a6%96%e7%82%b9%e3%81%ae%e3%82%ad%e3%83%a3%e3%83%a9%e3%82%af%e3%82%bf%e3%83%bc%e3%82%b3%e3%83%b3%e3%83%88%e3%83%ad%e3%83%bc%e3%83%a9%e3%82%92%e4%bd%9c-2/
からコピペしたのですがなぜこのコードで動くのがわかりません

実現したいこと

UnityのInputSystemの使い方を理解したい

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

[RequireComponent(typeof(Animator))]
[RequireComponent(typeof(Rigidbody))]
[RequireComponent(typeof(CapsuleCollider))]
public class Character : MonoBehaviour
{
Animator animator;
Rigidbody rb;
CapsuleCollider capsuleCollider;
public float jumpSpeed;
public float groundDistance;
public LayerMask groundMask;
public float gravityScale;
public float runSpeed; //
public float acceleration; //
public float maxGroundAngle;
public Camera playerCamera = null;
public GameObject avatar = null;
Rigidbody groundRigidbody = null;
Vector3 groundNormal = Vector3.up;
Vector3 groundContactPoint = Vector3.zero;
public float turnSmoothing;
public float airAcceleration = 10f; // 空中の加速度
public float maxAirSpeed = 2f; // 空中の最高速度
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>();
rb = GetComponent<Rigidbody>();
capsuleCollider = GetComponent<CapsuleCollider>();
this.animator = GetComponent<Animator>();

} // Update is called once per frame void Update() { if (animator != null) { animator.SetBool("OnGround", isOnGround); animator.SetFloat("MovementSpeed", groundVelocity.magnitude); } }

//たぶんここから
Vector2 movementInput = Vector2.zero;
public void Move(Vector2 input)
{
movementInput = input;
}

void OnMove(InputValue inputValue) { Move(inputValue.Get<Vector2>()); } public void Move(bool state) { if (state) { rb.velocity += Vector3.up * runSpeed; } } public void Jump(bool state) { if (state && isOnGround) { rb.velocity += Vector3.up * jumpSpeed; isJumping = true; if (animator != null) { animator.SetTrigger("Jump"); } if (!state) { isJumping = false; } } void OnJump(InputValue inputValue) { Jump(inputValue.isPressed); }

//ここまで

bool isOnGround = false; bool isJumping = false; Vector3 groundVelocity = Vector3.zero; RaycastHit CheckForGround() { float extent = Mathf.Max(0, capsuleCollider.height * 0.5f - capsuleCollider.radius); Vector3 origin = transform.TransformPoint(capsuleCollider.center + Vector3.down * extent) + Vector3.up * groundDistance; RaycastHit hitInfo; Ray sphereCastRay = new Ray(origin, Vector3.down); Physics.SphereCast(sphereCastRay, capsuleCollider.radius, out hitInfo, groundDistance * 2f, groundMask); return hitInfo; } void FixedUpdate() { RaycastHit hitInfo = CheckForGround(); isOnGround = hitInfo.collider != null; if (isOnGround) { groundNormal = hitInfo.normal; groundContactPoint = hitInfo.point; groundRigidbody = hitInfo.rigidbody; } else { groundNormal = Vector3.up; groundRigidbody = null; groundContactPoint = transform.TransformPoint(capsuleCollider.center + Vector3.down * capsuleCollider.height * 0.5f); } if (rb.velocity.y < 0) { isJumping = false; } if (isJumping) { rb.AddForce(Physics.gravity * rb.mass * (gravityScale - 1f)); } if (!isJumping && isOnGround) { ApplyMotion(); } } Vector3 ProjectOnPlane(Vector3 vector, Vector3 normal) { return Vector3.Cross(normal, Vector3.Cross(vector, normal)); } void ApplyMotion() { Vector3 movementRight = Vector3.right; Vector3 movementForward = Vector3.forward; if (playerCamera != null) { Vector3 cameraRight = playerCamera.transform.right; Vector3 cameraForward = playerCamera.transform.forward; movementRight = ProjectOnPlane(cameraRight, groundNormal).normalized; movementForward = ProjectOnPlane(cameraForward, groundNormal).normalized; } Vector3 movement = movementRight * movementInput.x + movementForward * movementInput.y; rb.AddForce(movement * acceleration, ForceMode.Acceleration); if (avatar != null) { Vector3 rotateTarget = new Vector3(movement.x, 0, movement.z); if (rotateTarget.magnitude > 0.1f) { Quaternion lookRotation = Quaternion.LookRotation(rotateTarget); avatar.transform.rotation = Quaternion.Lerp(lookRotation, avatar.transform.rotation, turnSmoothing); } } Vector3 velocity = rb.velocity; if (groundRigidbody != null) { velocity -= groundRigidbody.velocity; } groundVelocity = ProjectOnPlane(rb.velocity, groundNormal); if (groundVelocity.magnitude < runSpeed) { rb.AddForce(movement * acceleration, ForceMode.Acceleration); } float groundAngle = 90f - Mathf.Asin(groundNormal.y) * 180f / Mathf.PI; if (groundVelocity.magnitude < runSpeed && groundAngle <= maxGroundAngle) { rb.AddForce(movement * acceleration, ForceMode.Acceleration); } bool movingDownhill = movement.y <= 0f; if (groundAngle <= maxGroundAngle || movingDownhill) { if (groundVelocity.magnitude < runSpeed) { rb.AddForce(movement * acceleration, ForceMode.Acceleration); } } }

}

//たぶん無駄なコードが大量にありますがどれが無駄なのかわからないのでそのまま書きます。

試したこと

いくつもサイトを見ましたがこのやり方でやってる人は誰もいなかったしyoutubeでも違うやり方でした。

補足情報(FW/ツールのバージョンなど)

Unity 2021 3.7f
今は勉強中ですがほんとに初心者なので優しくして下さい。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

y_waiwai

2022/08/03 05:10

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity3D

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