Unity3D で横アクション制御の検証

20140129-001

背景との衝突判定方法を見直し

Unity のサンプルアセット Unity Projects: 2D Platformer を参考に地面の下から突きぬけられる足場の実装を検証してみた。

コライダーの衝突と、linecast による足場チェックを組み合わせてこんな感じ。

実験コードなので手抜きな個所はありますがうまいこといけそうなので次回はきちんとした判定でやってみますかね。

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

    float xspeed = 3f;
    float yspeed;
    float gravity = -5f;
    bool grounded = false;
    bool jump = false;

    GameObject groundcheck1, groundcheck2;

	// Use this for initialization
	void Start () {
        yspeed = 0f;
        groundcheck1 = GameObject.Find("groundcheck1");
        groundcheck2 = GameObject.Find("groundcheck2");
    }
	
	// Update is called once per frame
	void Update () {

        Vector3 v3Position = transform.localPosition;

        RaycastHit oHit;
        if (yspeed <= 0f) {
            grounded =
                Physics.Linecast(
                    transform.position,
                    groundcheck2.transform.position,
                    out oHit,
                    1 << LayerMask.NameToLayer("HalfCollider") | 1 << LayerMask.NameToLayer("Wall"));
        } else {
            grounded = false;
        }
        if (grounded) {
            if (Input.GetKeyDown(KeyCode.Space)) {
                Debug.Log("Jump");
                yspeed = 5f;
                jump = true;
            } else {
                Debug.Log("Grounded");
                yspeed = 0f;
            }
        }

        if (!grounded) {
            yspeed += gravity * Time.deltaTime;
        }

        v3Position.x += Input.GetAxis("Horizontal") * xspeed * Time.deltaTime;
        v3Position.y += yspeed * Time.deltaTime;

        transform.localPosition = v3Position;
	}

    void OnGUI() {
        GUILayout.BeginArea(new Rect(8, 8, Screen.width - 16, Screen.height - 16));
        GUILayout.Label("Position0 : " + transform.localPosition.ToString());
        GUILayout.Label("Position1 : " + groundcheck1.transform.position.ToString());
        GUILayout.Label("Position2 : " + groundcheck2.transform.position.ToString());
        GUILayout.Label("speed : " + xspeed.ToString() + ", " + yspeed.ToString());
        GUILayout.Label("grounded : " + grounded.ToString());
        GUILayout.EndArea();
    }

}

「シェアする」

ツイートツイート