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

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

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

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

Unity3D

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

Q&A

解決済

1回答

1891閲覧

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

pimen

総合スコア6

C#

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

Unity3D

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

0グッド

0クリップ

投稿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
今は勉強中ですがほんとに初心者なので優しくして下さい。

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

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

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

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

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

y_waiwai

2022/08/03 05:10

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

回答1

0

ベストアンサー

件のサイトで示されている方法は、InputSystemからの入力を抽象化して処理するというような方法で、マウスやキーボード、ジョイスティックの入力をInputSystem側で一旦解釈し、解釈結果をアプリケーション側に伝える、という物になっています。

恐らくよく見るサイトでの例などでは、例えばMouse.current.~のような形でデバイスの入力を直接参照している方法だと思いますが、InputSystemでの入力処理の方法はそれだけではない、ということです。
その方法の詳細はドキュメントGetting input indirectly through an Input Action
を見て貰った方が良いのかな?という気もしますが、ようは入力があったらInputSystemからOnJumpとかOnMoveとかのメソッドにコールバックがかかるから、アプリケーションはそれを処理してね、ということです。

追記:
すみません、ドキュメントとしてはUnityの新入力システム・Input Systemを使おうこっちの方が良いかも。日本語だし

投稿2022/08/03 07:03

編集2022/08/03 07:26
drednote

総合スコア336

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問