Notifications
Article
長ぁぁぁい!説明不要!
Updated 21 days ago
60
6
質問に書けなかった。
まいった。
このサイト(https://qiita.com/mkgask/items/6d04d0be13cc0b14d4fb)を参考に
ジャンプの処理を書いてみたのだが・・・
死ぬほどつかれた('A`)
・・・じゃなくて、下のソースの太字部分でエラーが出てテストすらできない状態で・・・
わかる人、誰か教えてください!

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; public class Player : MonoBehaviour { [SerializeField] float Speed = 0.05f; private bool jumpinput = false; private bool isjumping = false; private new Rigidbody2D rigidbody2D; // Use this for initialization void Start () { rigidbody2D = GetComponent<Rigidbody2D>(); } // Update is called once per frame void Update () { Vector2 position = transform.position; //ジャンプ動作 CheckGroundDistance(() => { jumpinput = false; isjumping = false; }); if (jumpinput || JumpInput()) jumpinput = true; //左右移動 if (Input.GetAxis("Horizontal") == -1) { position.x -= Speed; } else if (Input.GetAxis("Horizontal") == 1) { position.x += Speed; } transform.position = position; } private void FixedUpdate() { if (jumpinput) { if (!isjumping) { isjumping = true; DoJump(); } } } private bool JumpInput() { if (Input.GetButtonDown("Jump")) return true; return false; } [SerializeField] private float JumpPower = 5f; private void DoJump() { rigidbody2D.AddForce(Vector2.up * JumpPower, ForceMode2D.Impulse); } private int isGround = 0; private int notGround = 0; private const int isGroundStateCange = 5; [SerializeField] private float groundDistance = 0f; private const float groundDistanceLimit = 0.01f; private Vector2 raycastOffset = new Vector2(0f, 0.005f); private const float raycastSeachDistance = 100f; private void CheckGroundDistance(UnityAction landingAction = null, UnityAction takeOffAction = null) { RaycastHit hit; var layerMask = LayerMask.GetMask("Ground"); var isGroundHit = Physics2D.Raycast( transform.position + raycastOffset, transform.TransformDirection(Vector2.down), out hit, raycastSeachDistance, layerMask ); if (isGroundHit) { groundDistance = hit.distance; } else { groundDistance = float.MaxValue; } if(groundDistance < groundDistanceLimit) { if(isGround <= isGroundStateCange) { isGround += 1; notGround = 0; } } else { if(notGround <= isGroundStateCange) { isGround = 0; notGround += 1; } } if(isGroundStateCange == isGround && notGround == 0) { if (landingAction != null) landingAction(); } else if(isGroundStateCange == notGround && isGround == 0) { if (takeOffAction != null) takeOffAction(); } } }

Master.typeX
Unityが全く使えない変人 - Other
17
Comments
Yuji YASUHARA
Staff
20 days ago
Field Engineer - Programmer
お気になさらず。 そうですね、記事から引用するのであれば、なるべく記事と環境をあわせて、動かすことを目標にしたほうがよいでしょうね。 まず2Dのジャンプがやりたいことで、それが先にあるのであれば、別の情報を探したほうが良さそうに思います。 ストレスのないゲームプレイを成立させようと思うと、けっこう複雑なプログラムが必要になると思います。そういった細かさ、接地条件など無視した原始的なものは、例えば以下のようになるでしょう。 public class Player : MonoBehaviour { void Start() { var rb = GetComponent<Rigidbody2D>(); rb.drag = 10; } void FixedUpdate() { var hori = Input.GetAxis("Horizontal"); var rb = GetComponent<Rigidbody2D>(); const float force = 64f; rb.AddForce(new Vector2(hori * force, 0f)); } void Update() { var jump = Input.GetButtonDown("Fire1"); if (jump) { var rb = GetComponent<Rigidbody2D>(); const float jump_force = 16f; rb.AddForce(new Vector2(0f, jump_force), ForceMode2D.Impulse); } } }
1
Master.typeX
20 days ago
Unityが全く使えない変人 - Other
Yuji YASUHARAどうやら、元記事はRigidbodyを使用しているところを、Master.typeXさんはRgidbody2Dで実装しようとしてその差異でエラーが出ているようですね。 元記事を参照するならRigidbody(つまり3次元)にしてしまうか、2Dにするなら2D用のスクリプトリファレンスを参照する必要があります。 Raycast2DのRaycastのリファレンスはこちらで、 https://docs.unity3d.com/ja/2017.4/ScriptReference/Physics2D.html#Raycast これに従って記述すると RaycastHit2D hit = Physics2D.Raycast(new Vector2(transform.position.x, transform.position.y + 0.005f), new Vector2(Vector2.down)); のようにしていくのかな、と思います。
うーん、まだエラーが出てきて訳が分からなくなってきました・・・ほかの方法を探った方がいいのでしょうか・・・ もしそうなってしまった場合は教えてくださったのに申し訳ない気持ちが・・・
1
Yuji YASUHARA
Staff
20 days ago
Field Engineer - Programmer
どうやら、元記事はRigidbodyを使用しているところを、Master.typeXさんはRgidbody2Dで実装しようとしてその差異でエラーが出ているようですね。 元記事を参照するならRigidbody(つまり3次元)にしてしまうか、2Dにするなら2D用のスクリプトリファレンスを参照する必要があります。 Raycast2DのRaycastのリファレンスはこちらで、 https://docs.unity3d.com/ja/2017.4/ScriptReference/Physics2D.html#Raycast これに従って記述すると RaycastHit2D hit = Physics2D.Raycast(new Vector2(transform.position.x, transform.position.y + 0.005f), new Vector2(Vector2.down)); のようにしていくのかな、と思います。
1
Master.typeX
21 days ago
Unityが全く使えない変人 - Other
Yuji YASUHARAこんなときはエラーメッセージを質問文に入れるようにしましょう!コードを目で追って原因を突き止めるのは熟練者にも難しいことですから。 さてエラーですが、 transform.position + raycastOffset, これが Vector3 と Vector2 の足し算になっているので、 transform.position + new Vector3(raycastOffset.x, raycastOffset.y, 0f), のように直してみたらどうでしょうね?
すみません・・・途中で送信してしまいました・・・ ええと、コードを直してみたんですがまだエラーになりますね・・・ Assets/Script/Player.cs(98,37): error CS1502: The best overloaded method match for UnityEngine.Physics2D.Raycast(UnityEngine.Vector2, UnityEngine.Vector2, float, int, float)' has some invalid arguments Assets/Script/Player.cs(101,17): error CS1615: Argument#3' does not require out' modifier. Consider removingout' modifier
1
Master.typeX
21 days ago
Unityが全く使えない変人 - Other
Yuji YASUHARAこんなときはエラーメッセージを質問文に入れるようにしましょう!コードを目で追って原因を突き止めるのは熟練者にも難しいことですから。 さてエラーですが、 transform.position + raycastOffset, これが Vector3 と Vector2 の足し算になっているので、 transform.position + new Vector3(raycastOffset.x, raycastOffset.y, 0f), のように直してみたらどうでしょうね?
すみません・・・今度から気を付けます・・・
0