private Vector3 movement;
public float runSpeed = 6;
public float jumpForce = 25f;
private void Update()
{
float h = Input.GetAxis("Horizontal");
Move(h);
movement.y += cc.isGrounded ? 0f : Physics.gravity.y * 10f * Time.deltaTime;
anim.SetFloat("forward", cc.velocity.magnitude);
anim.SetBool("grounded", cc.isGrounded);
print(cc.velocity.magnitude);
if (h!=0)
{
Vector3 direct = Vector3.right * h;
MyRotate(direct, 10);
}
if(Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
if(Input.GetKeyDown(KeyCode.G))
{
GrabCheck();
}
}
public void Move(float h)
{
//movement = new Vector3(h * runSpeed * Time.deltaTime, cc.velocity.y, 0);
//cc.Move(movement);
movement.x = h * runSpeed;
movement.z = 0;
cc.Move(movement * Time.deltaTime);
}
public void Jump()
{
if (cc.isGrounded)
{
movement.y = jumpForce;
}
}
public void GrabCheck()
{
}
protected CharacterController cc;
protected Animator anim;
protected bool rotateComplete = true;
private void Awake()
{
anim = GetComponentInChildren<Animator>();
cc = GetComponent<CharacterController>();
}
public void MyRotate(Vector3 lookDirec, float trunSpeed)
{
rotateComplete = false;
}
public void Death()
{
}
public void TakeDamage(Character inflicter,int damage)
{
}
public void Attack()
{
}
if (h != 0)//巧妙的控制转向问题,3D 横版的转向。
{
Vector3 direct = Vector3.right * h;
MyRotate(direct, 10);//可控制旋转,正90,-90
}
public void MyRotate(Vector3 lookDirec, float trunSpeed)
{
rotateComplete = false;
Vector3 targetPos = transform.position + lookDirec;
Vector3 characterPos = transform.position;
//去除Y轴影响
characterPos.y = 0;
targetPos.y = 0;
//角色面朝的目标向量
Vector3 faceToDir = targetPos - characterPos;
//角色面朝目标方向的四元数
Quaternion faceToQuat = Quaternion.LookRotation(faceToDir);
//球面插值
Quaternion slerp = Quaternion.Slerp(transform.rotation, faceToQuat, trunSpeed * Time.deltaTime);
if(slerp == faceToQuat)
{
rotateComplete = true;
}
transform.rotation = slerp;
}
float dist = cc.height / 2;
//检测下方距离。
RaycastHit hit;
if (Physics.Raycast(transform.position, Vector3.down, out hit, dist + 0.05f))
{
if(hit.transform.GetComponent<Character>()&& hit.transform!=transform)
{
hit.transform.GetComponent<Character>().TakeDamage(this,damage);
}
}
//相机跟随 横版的,比较经典啦
public Transform target;
public float distance = 8f;
public float hight = -1f;
private void LateUpdate()
{
if (!target) return;
transform.position = target.position;
transform.position -= Vector3.forward * distance;
transform.position = new Vector3(transform.position.x, transform.position.y+hight, transform.position.z);
}
//三个控制动画状态的脚本太巧妙啦。速度长度,是否落地,是否有物体。
anim.SetFloat("forward", cc.velocity.magnitude);
anim.SetBool("grounded", cc.isGrounded);
anim.SetBool("isgrab", grabObject ? true : false);
//characterContoler的移动脚本很经典了,符合物理规则
public void Move(float h)
{
//movement = new Vector3(h * runSpeed * Time.deltaTime, cc.velocity.y, 0);
//cc.Move(movement);
movement.x = h * runSpeed;
movement.y += cc.isGrounded ? 0f : Physics.gravity.y * 10f * Time.deltaTime;
movement.z = 0;
cc.Move(movement * Time.deltaTime);
}
抓取脚本很强。
public void GrabCheck()
{
if(grabObject != null && rotateComplete)
{
//有抓取物,并且转向完成
grabObject.transform.SetParent(null);
grabObject.GetComponent<Rigidbody>().isKinematic = false;
grabObject = null;
}
else
{
float dist = cc.radius;
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit, dist + 1))
{
if(hit.collider.CompareTag("GrabBox"))
{
grabObject = hit.transform;
grabObject.SetParent(socketObject);
grabObject.localPosition = Vector3.zero;
grabObject.localRotation = Quaternion.identity;
grabObject.GetComponent<Rigidbody>().isKinematic = true;
}
}
}
模拟敌人攻击很经典啦。
void Update() {
if (Time.time > lastCheckStateTime + 2)
{
lastCheckStateTime = Time.time;
simulateInputX = Random.Range(-1, 1f);
simulateJump = Random.Range(0, 2) == 1 ? true : false;
}
anim.SetFloat("forward", cc.velocity.magnitude);
anim.SetBool("grounded", cc.isGrounded);
MoveControl(simulateInputX);
Jump(simulateJump);
Attack();
}