移動で作成してスクリプトにジャンプ機能を具現してみました。
Unity(ユニティ)整理:01.移動
ジャンプも基本的には移動と同じと思いました。
GameObjectにRigidbodyコンポネントを追加して重力を適用してから移動で利用して方式を応用しました。
1.Transform.Translate利用
--------------
if (Input.GetKey(KeyCode.Space))
{
transform.Translate(Vector3.up * Time.deltaTime *100 );
}
重力が強いなのか100ぐらいを乗じたらジャンプに見えました。
Positionを直接移動させたので不自然なジャンプです。
--------------
2.RigidBody.Velocity利用
--------------
private Rigidbody rb;
void Start () {
rb = GetComponent<Rigidbody>();
}
if (Input.GetKey(KeyCode.Space))
{
rb.velocity = new Vector3(0, 5, 0);
}
5ぐらいの設定でずいぶん良いジャンプです。
--------------
3.RigidBody.AddForce利用
--------------
private Rigidbody rb;
void Start () {
rb = GetComponent<Rigidbody>();
}
if (Input.GetKey(KeyCode.Space))
{
rb.AddForce = new Vector3(0, 100, 0);
}
100ぐらいの設定でずいぶん良いジャンプです。
--------------
問題がありました。
スペースキーをずっと押していると無限ジャンプになります。
Plainに触れている状態のみジャンプが可能にしてみました。
--------------
private bool isJumping=false; //ジャンプ処理したのかを確認するため
.
..
...
if (Input.GetKey(KeyCode.Space) && isJumping==false)
{
rb.AddForce = new Vector3(0, 100, 0);
isJumping=true;
}
--------------
ここまでにするとジャンプは1回しかできません。
Plainに触れたときisJumping=falseへ変更処理が必要です。
2つ方法で処理してみました。
1.OnCollisionEnter利用
--------------
Plain:Inspector:TagをGroundに設定しました。
private void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.CompareTag("Ground"))
{
isJumping = false;
}
}
Collider.OnCollisionEnter(Collision)
--------------
2.Physics.Linecast利用
--------------
Plain:Inspector:LayerをGroundに設定しました。
isJumping= Physics.Linecast(transform.position, transform.position - transform.up * 1.1f, LayerMask.GetMask("Ground") );
を
if (Input.GetKey(KeyCode.Space) && isJumping==false)
の上追加しました。
ジャンプ処理後の isJumping=true; はなくでも良かったので削除しました。
Physics.Linecast
--------------
Unity(유니티) 정리: 02.점프

댓글 없음:
댓글 쓰기