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);
	}






你可能感兴趣的:(C#,unity3d,人物)