内容简介:在前面实现了角色进行跳动,可以在Y轴方向,也就是向天空方向进行移动了,并且也实现加速度的方式进行移动,可见这里大家要多学习物理知识,否则速度、加速度、重力是什么都不知道,这样是开发不了游戏的。不过,这个游戏还有一个问题,当你把角色走到地板边缘时,角色一不小心,就像掉到万丈深渊,并且还在加速往下掉。看来要解决这个问题了,那么怎么样解决呢?先看查看一下问题根源,如下这行代码:yVelocity -= gravity * Time.deltaTime;在游戏每帧里都会减少,不管角色在那里,也就是说角色的不断产生
在前面实现了角色进行跳动,可以在Y轴方向,也就是向天空方向进行移动了,并且也实现加速度的方式进行移动,可见这里大家要多学习物理知识,否则速度、加速度、重力是什么都不知道,这样是开发不了游戏的。不过,这个游戏还有一个问题,当你把角色走到地板边缘时,角色一不小心,就像掉到万丈深渊,并且还在加速往下掉。看来要解决这个问题了,那么怎么样解决呢?先看查看一下问题根源,如下这行代码:
yVelocity -= gravity * Time.deltaTime;
在游戏每帧里都会减少,不管角色在那里,也就是说角色的不断产生加速向下的速度,越来越大。因此,要想办法让角色碰到地面之后,就让它复位为0,这样就不会加速向下掉下去了。那么问题又来了,怎么样才能知道角色碰到地面了呢?我们来翻查unity手册,发现Character Controller里有一个属性:isGrounded,它的定义如下:
CharacterController.isGrounded
Was the CharacterController touching the ground during the last move?
它定义为bool类型,当角色最后一次移动是否触碰到地面,如果碰到就设置为true。为了检测到角色的触碰问题,应该使用角色的移动函数move() 或者 simpleMove(),并且地面添加了碰撞 Clider。
因此,添加地面检测之后,代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BasicMovement : MonoBehaviour { public float speed = 10.0f; public float rotationSpeed = 2.0f; public Transform head; public float maxHeadRotation = 80.0f; public float minHeadRotation = -80.0f; private float currentHeadRotation = 0; private float yVelocity = 0; public float jumpSpeed = 15.0f; public float gravity = 30.0f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (GetComponent<CharacterController>().isGrounded) { yVelocity = 0; } if (Input.GetButtonDown("Jump")) { yVelocity = jumpSpeed; } Vector3 input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")); //gameObject.GetComponent<CharacterController>().Move(transform.TransformDirection(input * speed * Time.deltaTime)); gameObject.GetComponent<CharacterController>().Move(transform.TransformDirection(input * speed * Time.deltaTime + yVelocity * Vector3.up * Time.deltaTime)); yVelocity -= gravity * Time.deltaTime; Vector2 mouseInput = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); transform.Rotate(Vector3.up, mouseInput.x * rotationSpeed); //Debug.Log(mouseInput.x + ":" + mouseInput.y); //head.Rotate(Vector3.left, mouseInput.y * rotationSpeed); currentHeadRotation = Mathf.Clamp(currentHeadRotation + mouseInput.y * rotationSpeed, minHeadRotation, maxHeadRotation); head.localRotation = Quaternion.identity; head.Rotate(Vector3.left, currentHeadRotation); } }
这时,再去运行这个游戏,发现跳动碰到地面之后,就会变为0,如果在边沿也是慢慢地掉下去了。比如跳上一个箱子上面,再跳下来,就比较慢了。
不过,你会发现还有一个问题,角色在空中也可以跳动,这一般不符合常理的,因此要把跳动的代码移到接地判断里面,这样就不会在空气中进行跳动了,如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BasicMovement : MonoBehaviour { public float speed = 10.0f; public float rotationSpeed = 2.0f; public Transform head; public float maxHeadRotation = 80.0f; public float minHeadRotation = -80.0f; private float currentHeadRotation = 0; private float yVelocity = 0; public float jumpSpeed = 15.0f; public float gravity = 30.0f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { if (GetComponent<CharacterController>().isGrounded) { yVelocity = 0; if (Input.GetButtonDown("Jump")) { yVelocity = jumpSpeed; } } Vector3 input = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")); //gameObject.GetComponent<CharacterController>().Move(transform.TransformDirection(input * speed * Time.deltaTime)); gameObject.GetComponent<CharacterController>().Move(transform.TransformDirection(input * speed * Time.deltaTime + yVelocity * Vector3.up * Time.deltaTime)); yVelocity -= gravity * Time.deltaTime; Vector2 mouseInput = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); transform.Rotate(Vector3.up, mouseInput.x * rotationSpeed); //Debug.Log(mouseInput.x + ":" + mouseInput.y); //head.Rotate(Vector3.left, mouseInput.y * rotationSpeed); currentHeadRotation = Mathf.Clamp(currentHeadRotation + mouseInput.y * rotationSpeed, minHeadRotation, maxHeadRotation); head.localRotation = Quaternion.identity; head.Rotate(Vector3.left, currentHeadRotation); } }
在这里判断角色落到地面之后,才允许向上跳动。到这里,就实现角色碰到地面,以及解决空中跳动的问题。
C++标准模板库从入门到精通
http://edu.csdn.net/course/detail/3324
跟老菜鸟学C++
http://edu.csdn.net/course/detail/2901
跟老菜鸟学python
http://edu.csdn.net/course/detail/2592以上所述就是小编给大家介绍的《游戏制作之路(20)角色跳动之后怎么样检测接触地面》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 刷 携程 地面业务 前端面试经历
- 游戏制作之路(6)创建角色行走的地面
- Chrome 小恐龙游戏源码探究二 -- 让地面动起来
- 字节跳动的面试感受
- 字节跳动混沌工程实践总结
- 面试字节跳动,我被怼了....
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
奔跑吧 Linux内核
张天飞 / 人民邮电出版社 / 2017-9-1 / CNY 158.00
本书内容基于Linux4.x内核,主要选取了Linux内核中比较基本和常用的内存管理、进程管理、并发与同步,以及中断管理这4个内核模块进行讲述。全书共分为6章,依次介绍了ARM体系结构、Linux内存管理、进程调度管理、并发与同步、中断管理、内核调试技巧等内容。本书的每节内容都是一个Linux内核的话题或者技术点,读者可以根据每小节前的问题进行思考,进而围绕问题进行内核源代码的分析。 本书内......一起来看看 《奔跑吧 Linux内核》 这本书的介绍吧!