1. 程式人生 > >Unity3D控制人物移動跳躍,處理CharacterController的isGrounded總是返回false問題

Unity3D控制人物移動跳躍,處理CharacterController的isGrounded總是返回false問題

在Unity3D中控制人物移動的方法很多,可以使用transform.Translate方法,但為了不穿越其他物體,需要使用剛體rigidbody。還可以使用角色控制器,角色控制器是自帶剛體Rigidbody和碰撞器Collider的,移動可以使用CharacterController元件。

在使用CharacterController元件實現跳躍時,需要檢測人物是否在地面上,CharacterController提供了屬性isGrounded以供檢測,但是在使用中發現isGrounded總是返回false,沒有找到原因,因此替代使用射線檢測方法來判斷是否著地,射線檢測其實就是用從人物身體發射一條向下的射線判斷射線在給定距離內是否碰撞物體即可以判斷是否著地。程式碼如下:

	public float speed = 1;

	public float jumpSpeed = 10;

	public float gravity = 20;

	public float margin = 0.1f;

	private Vector3 moveDirection = Vector3.zero;

	// 通過射線檢測主角是否落在地面或者物體上
	bool IsGrounded() {
		return Physics.Raycast(transform.position, -Vector3.up,  margin);
	}

	// Update is called once per frame
	void Update () {
		// 控制移動
		float h = Input.GetAxis ("Horizontal");
		float v = Input.GetAxis ("Vertical");

		if (IsGrounded()) {
			moveDirection = new Vector3 (h, 0, v);
			moveDirection = transform.TransformDirection (moveDirection);
			moveDirection *= speed;
			// 空格鍵控制跳躍
			if (Input.GetButton ("Jump")) {
				moveDirection.y = jumpSpeed;
			}
		}
		moveDirection.y -= gravity * Time.deltaTime;
		controller.Move (moveDirection * Time.deltaTime);
	}