unity3d实现跳跃

 

跳跃比控制方向移动稍微难一点

环境配置

1.新建2d项目

2.添加2d -> sprite作为物品设置sprite图片

4.给sprite添加rigidbody2d ,boxcollider2d    

5.添加个2d -> sprite shape控件作为地板,添加boxcollider2d

 

因为有rigidbody所以我们只需要让物体上升就好了 ,物体会自己落下来

 

第一种

完全是按照方向移动的思路写的跳  ,发现物体瞬间移动到控制了

	void Update() {
		if (Input.GetKeyDown(KeyCode.Space)) {
			// 如果不加 Space.World如果物体旋转过 跳的方向就不是往上了 ,斜了
			transform.Translate(new Vector3(0, 10, 0), Space.World);
		}
	}

如果使用MovePosition

	void Update() {
		if (Input.GetKeyDown(KeyCode.Space)) {
	 
			var component = transform.GetComponent<Rigidbody2D>();
			component.MovePosition(component.position + new Vector2(0, 5));
		}
	}

第二种

缓慢上升 ,高度可用控制  ,代码有点多 

  private float speed = 30;
	  bool jump = false;
	  float jhigh = 0f;
	  float maxJhigh = 5f;
	 
	  void Update() {
	 
	  	if (Input.GetKeyDown(KeyCode.Space)) {
	  		jump = true;
	  		print("start");
	  		jhigh = 0;
	  	}
	  	
	  	if (jump) {
	  		float high = 1 * speed * Time.deltaTime;
	 
	  		if (jhigh + high >= maxJhigh) {
	  			jump = false;
	  		}
	  		transform.Translate(new Vector3(0, high, 0), Space.World);
	  		jhigh += high;
	  		print(jhigh);
	  	}
	  }

 

第三种

使用Force 施加力  ,有弹跳感  推荐这种

	void Update() {
		if (Input.GetKeyDown(KeyCode.Space)) {

			var component = transform.GetComponent<Rigidbody2D>();
			component.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
		}
	}

 

优化版

添加射线检测 只能在地上才可以跳

 

	// 用于在屏幕输出位置
    private void OnDrawGizmos() {
		Gizmos.color = Color.white;
		Gizmos.DrawRay(transform.position + colliderOffset,Vector3.left);
	}
	
	void Update() {
		
		RaycastHit2D onGround2 = Physics2D.Raycast(transform.position + colliderOffset, -Vector2.up);
		print("b" + transform.position + ",c=" + colliderOffset + ",d=" + onGround2.distance);
		
		if (onGround2.distance <= 0) {
			if (Input.GetKeyDown(KeyCode.Space)) {
				var component = transform.GetComponent<Rigidbody2D>();
				component.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
			}
		}
	}

 

 

优化2

上个版本的问题是 可能不是在地面 在别的隐藏的碰撞器上面 需要加上过滤

 

		Debug.DrawRay(transform.position + colliderOffset, Vector3.down * 5);
		if (Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.W)) {
			RaycastHit2D onGround2 = Physics2D.Raycast(transform.position + colliderOffset, -Vector2.up, 5, buildingsMask);
			if (onGround2.collider != null && onGround2.distance <= 0) {
				component.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
			}
		}

 

二阶段跳

	/**
	 * 是否跳过一次
	 */
	private bool jumpOne;
	
    void jump() {

		Debug.DrawRay(transform.position + colliderOffset, Vector3.down * 5);
		if (Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.W)) {
			RaycastHit2D onGround2 = Physics2D.Raycast(transform.position + colliderOffset, -Vector2.up, 5, buildingsMask);

			if (onGround2.collider != null && onGround2.distance <= 0) {
				rig.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
				jumpOne = true;
			}
			else if (jumpOne) {
				// 第二次跳
				rig.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
				jumpOne = false;
			}
		}
	}

 


版权声明:本文为hewei314599782原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。