unity手游(1)使用CharacterController控制人物移动

前言


本文由作者@zx一路飞奔出品,转载请注明出处
文章地址:http://blog.csdn.net/u014735301/article/details/42966247
作者微博:http://weibo.com/u/1847349851 



之前在网上找到一个完整的rpg的游戏demo,断断续续自个琢磨了2个月,
学习NGUI的时候,就用NGUI插件把游戏本身基于GUI的部分UI界面改编了一下,
一直在看里面的游戏逻辑,刚开始一头雾水,之后慢慢的理解一部分东西了,借此写博客的机会,
决定重新开始学习其代码,参考下,做一个手游RPGdemo,自己对于RPG的美好记忆应该是源于小学时候玩的98版仙剑奇侠传。恩,真的是人生中美好的记忆~


CharacterController


开始正题,对于人物的移动,一般可以给人物添加collider和rigidbody组件,也可以添加CharacterController人物控制组件来进行控制

CharacterController包含Rigidbody组件的一些属性,个人理解,有了CharacterController,就不用再添加Rigidbody组件了,

控制器不会对加在它自身上的力做出反应,也不会自动推开其他刚体。

如果想让角色控制器推开其他刚体或者对象,你可以在对象附加的脚本中添加OnControllerColliderHit()函数,这样对它们施加力就能够产生碰撞。


unity手游(1)使用CharacterController控制人物移动_第1张图片


长得像一个胶囊体,对于其属性的一些调整,有一些需要注意的

Slope Limit 坡度限制,不能设的太小,一般使用90度会比较合适。由于是胶囊体,角色控制器不会爬上墙。

Step Offset 角色可以迈上的最高台阶高度,确保对于一个两米大小的人来说该值介于0.1到0.4之间。

Skin width 皮肤厚度,皮肤厚度决定了两个碰撞器可以互相渗入的深度。较大的皮肤厚值度会导致颤抖。小的皮肤厚度值会导致角色被卡住。

实践中比较好的值是至少要大于0.01并且大于Radius的10%。如果发现你的角色频繁被卡住,尝试调整Skin Width值。

Min Move Distance 角色移动距离小于该值,角色就不会移动,避免颤抖现象,建议为0就行

center 调整胶囊体的位置

Radius 胶囊体半径,

Height 高度


下面来了解下,如何使用CharacterController来控制人物移动,上代码!


	void Move(){
		//控制移动
		float h = Input.GetAxis("Horizontal");
		float v = Input.GetAxis("Vertical");
		if(h != 0 || v != 0){
			//angle为人物 绕y轴旋转的角度
			float angle = Mathf.Atan2(h,v) * Mathf.Rad2Deg;
			targetRotation = Quaternion.Euler(new Vector3(0, angle, 0));
			//旋转人物方向
			this.transform.rotation = Quaternion.Lerp(this.transform.rotation,targetRotation,Time.deltaTime *25);

			moveSpeed = 3.5f;
			ctrlAnimState = ControlAnimationState.Move;	
		}else{
			moveSpeed = 0;
			ctrlAnimState = ControlAnimationState.Idle;	
		}
//		if(target!=null){
//			this.transform.LookAt(target.transform.position);
//			destinationDistance = Vector3.Distance(target.transform.position,this.transform.position);
//			if(destinationDistance < 1f){
//				moveSpeed = 0f;
//				ctrlAnimState = ControlAnimationState.Idle;	
//				target = null;
//			}else{
//				moveSpeed = 3.5f;
//				ctrlAnimState = ControlAnimationState.Move;	
//			}
//		}

		if(ctrlAnimState == ControlAnimationState.Move){
			if(controller.isGrounded){
				movedir = Vector3.zero;
				movedir = transform.TransformDirection(Vector3.forward*moveSpeed);
			}
		}else
		{		
			movedir = Vector3.Lerp(movedir,Vector3.zero,Time.deltaTime * 10);	
		}
		//应用重力
		movedir.y -= 20 * Time.deltaTime;
		//move
		controller.Move(movedir * Time.deltaTime);	
	}






你可能感兴趣的:(【unity3d】【项目】)