Character Controller这个组件有一部分rigibody作用,和碰撞体作用。
你做的游戏有2个种类,敌人,主角,可以做一个公共的类来存放两者的数据。把相似行为写成方法封装到父类中。
1、角色移动方法:
cc.Move(里面要加time.deltatime),cc.SimpleMove()2种,后者是有物理重力在里面,前者没有。
但是你会发现用cc.SimpleMove()会很别扭,这里有个设置Y轴跳跃力的经典方法《pendingVelocity.y += cc.isGrounded ? 0 : Physics.gravity.y * 10 * Time.deltaTime;》这样会跳的很舒服。
不要在公共类里用Update,否则会失效,玩家的输入输出不会更新。
cc.isGrounded可以做地面检测,检测后跳跃
用rig移动的主要思想 定义一个向量Vector3 pendingVelocity;分别设置他的X,Y,Z方向的速度大小。
旋转需要一个标志位rotateComplete,为后面的搬箱子做铺垫,如果箱子在你没有转向完全就抬起,箱子方向就会大乱,导致无法一直搬运了,也就是无法抬起了。
public void Rotate(Vector3 lookDirect, float turnSpeed)//旋转技巧。
{
rotateComplete = false;
Quaternion faceToQuater = Quaternion.LookRotation(lookDirect);
Quaternion slerp = Quaternion.Slerp(transform.rotation, faceToQuater, turnSpeed * Time.deltaTime);
if(slerp == faceToQuater)
{
rotateComplete = true;
}
transform.rotation = slerp;
}
public void AttackCheck()//攻击检测。
{
RaycastHit hit;
if(Physics.Raycast(transform.position,Vector3.down,out hit ,0.2f))
{
if(hit.transform.GetComponent<Character>() && hit.transform!=transform)
{
hit.transform.GetComponent<Character>().TakeDamage(this, damage);
}
}
}
}
void LateUpdate ()//相机跟随玩家移动不跟随玩家的Y移动。相机一般是在Late里
{
if (!player) return;
offset = new Vector3(player.position.x, 1, player.position.z - 8);
transform.position = offset;
}
//动画状态设计技巧。
anim.SetFloat("forward", cc.velocity.magnitude);
anim.SetBool("isground", cc.isGrounded);
anim.SetBool("grab", grabObject ? true : false);
public void GrabCheck() //抓取检测
{
if(grabObject !=null && rotateComplete == true)
{
grabObject.GetComponent<Rigidbody>().isKinematic = false;
grabObject.parent =null;
grabObject = null;
}
else if (grabObject == null)
{
float dis = cc.radius;
RaycastHit hit;
if(Physics.Raycast(transform.position+new Vector3(0,dis,0),transform.forward,out hit ,dis+1))
{
if(hit.transform.tag == "GrabBox")
{
grabObject = hit.transform;
grabObject.SetParent(grabSocket);
grabObject.localPosition = Vector3.zero;
grabObject.localRotation = Quaternion.identity;
grabObject.GetComponent<Rigidbody>().isKinematic = true;
}
}
}
}
//这个就比较强大了,模拟AI,厉害。
private float lastCheckStateTime = 0;
private float simulateH;
private bool simulateJump;
private int simulateFrequency = 2;
if(Time.time > lastCheckStateTime+ simulateFrequency)
{
lastCheckStateTime = Time.time;
simulateH = Random.Range(-1, 2);
simulateJump = Random.Range(0, 2) == 1 ? true : false;
}