unity中利用纯物理工具制作角色移动跳跃功能
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour {
protected ContactFilter2D contactFilter;
protected RaycastHit2D[] hitBuffer = new RaycastHit2D[16];
protected List<RaycastHit2D> hitBufferList = new List<RaycastHit2D>(16);
protected Rigidbody2D rigid2D;
protected Vector2 move;
public float minGroundNormalY = 0.6f;
public bool grounded = false;
//public float jumpForce=20f;
public float jumpSpeed = 5f;
public float horizonForce = 30f;
public Vector2 maxSpeed;
// Use this for initialization
void Start () {
rigid2D = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update () {
//实现跳跃的三种方案
//01,直接添加一个向上的力
//if (grounded && Input.GetKeyDown(KeyCode.Space)) rigid2D.AddForce(Vector2.up * jumpForce);
//02,直接添加一个向上的速度
//if (grounded && Input.GetKeyDown(KeyCode.Space)) rigid2D.velocity=(Vector2.up * jumpSpeed)+Vector2.right*rigid2D.velocity.x;
//03,蓄力实现不同的跳跃高度,这里需要设置跳跃按钮的增量速度
float j = Input.GetAxis("Jump");
if (grounded && (Input.GetButtonUp("Jump")||j>0.99f)) rigid2D.velocity = (Vector2.up * jumpSpeed*j) + Vector2.right * rigid2D.velocity.x;
if ((Mathf.Abs(Input.GetAxis("Horizontal")) > 0.01) && (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))) rigid2D.AddForce(Vector2.right * Mathf.Sign(Input.GetAxis("Horizontal")) * horizonForce);
//设置角色减速
if (grounded && !(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D) || Input.GetKeyDown(KeyCode.Space))) rigid2D.drag = 20f;
else rigid2D.drag = 0f;
}
private void FixedUpdate()
{
grounded = false;
CheckGround();
if (Mathf.Abs(rigid2D.velocity.x) > maxSpeed.x) rigid2D.velocity = new Vector2(Mathf.Sign(rigid2D.velocity.x) * maxSpeed.x, rigid2D.velocity.y);
}
//判断是正站在某个物体上
void CheckGround()
{
move = Vector2.down;
int count = rigid2D.Cast(move, contactFilter, hitBuffer, 0.02f);//对碰撞体向下的方向检测是否站在某个物体上,精度由检测的射线数和射线长度决定
hitBufferList.Clear();
for (int i = 0; i < count; i++)
{
hitBufferList.Add(hitBuffer[i]);
}
//如果有一个 射线的碰撞点的法线的y大于minGroundNormalY那么设置grounded为true表示站在了物体上
//这里minGroundNormalY一般设置为1到0.6之间即可决定站的平面的倾斜度
for (int i = 0; i < hitBufferList.Count; i++)
{
Vector2 currentNormal = hitBufferList[i].normal;
if (currentNormal.y > minGroundNormalY)
{
grounded = true;
}
}
}
}
unity中利用纯物理工具制作角色移动跳跃功能的更多相关文章
- Unity中利用柏林噪声(perlinnoise)制作摇摆效果
perlinnoise是unity中Mathf下的一个函数,需要两个float参数x和y进行采样,返回一个0-1的float型. 项目里经常要随机摇摆某些东西,比如摄像机,某个随机运动的目标等等,都可 ...
- Unity中利用委托与监听解耦合的思路
这篇随笔是一篇记录性的随笔,记录了从http://www.sikiedu.com/my/course/304,这门课程中学到的内容,附带了一些自己的思考. 一.单例模式的应用 首先假想一种情况,现在需 ...
- Unity中利用光线投射实现摄像机拉近追踪对象
项目中要求实现摄像机跟踪人物移动,并且可以水平360°,上下接近180°的自由旋转.这些操作网上已近有很多版本的实现,在此不再赘述.我在此想说的是,当摄像机移动到场景边界,或者触碰到场景中的障碍物的时 ...
- 关于Unity中的旋涡特效的制作(捕鱼达人3技术)(专题八)
Mesh--材质--Shader 1: Mesh 是网格,包括顶点,法线,纹理坐标,切线,三角形.在每一个3D模型节点里面,有一个Mesh Filter组件来提取模型里面的网格数据;2: Shader ...
- Unity3D题目,Unity中利用GUI输出九九乘法表
网上看到的这题,下面贴出源代码 using UnityEngine;using System.Collections; public class c99 : MonoBehaviour//C#脚本名: ...
- 在MVC中利用uploadify插件实现上传文件的功能
趁着近段的空闲时间,开发任务不是很重,就一直想把以前在仓促时间里所写的多文件上传功能改一下,在网上找了很多例子,觉得uploadify还可以,就想用它来试试.实现自己想要的功能.根据官网的开发文档,同 ...
- 在Asp.Net MVC中利用快递100接口实现订阅物流轨迹功能
前言 分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递100做为数据来源接口,这个接口是收费的,不过提供的功能还是非常强大的,有专门的售后维护团队.也有免费的方案,类似于快递 ...
- 037、Java中利用判断语句实现三目运算的功能
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术
转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...
随机推荐
- Windows10 家庭版没有本地组策略解决方法
windows 家庭版默认是没有本地组策略的, win+R运行gpedit.msc提示不存在 下面的代码保存一个cmdorbat 脚本文件add_gpedit.cmd, 并执行 add_gpedit. ...
- OpenGL超级宝典笔记——贝塞尔曲线和曲面(转)
http://my.oschina.net/sweetdark/blog/183721 参数方程表现形式 在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即 ...
- Docker容器学习与分享05
Docker镜像操作 学完了一些最基本的操作之后,我学习了一些关于docker镜像的基本操作. 首先来学习一下从docker hub上拉取镜像,以centos镜像为例,使用docker search命 ...
- Spring Boot 的 Security 安全控制
Spring Security 是一个强大且高度可定制的身份验证和访问控制框架,完全基于 Spring 的应用程序的标准,Spring Security 为基于 Java EE 的企业应用程序提供了一 ...
- Apache Kafka系列(一) 起步
Apache Kafka系列(一) 起步 Apache Kafka系列(二) 命令行工具(CLI) Apache Kafka系列(三) Java API使用 Apache Kafka系列(四) 多线程 ...
- oracle11g dataguard 备库数据同步的检查方法
概述: 一.环境 主库: ip地址:192.168.122.203 oracle根目录:/data/db/oracle SID:qyq 数据文 ...
- Jmeter上传下载文件
每次使用时都会忘记,此处是存储网路上通用的方式. 1.上传文件 记得勾选“use multipart/form-data for post”,表明此请求包含文件信息.在信息请求头中,需加入“Con ...
- kubernetes 资源请求和限制
1. spec: containers: - name: example resources: requests: ...
- OpenGL笔记(四) API参考
常见API glActiveTexture 选择活动纹理单元 glAttachShader 将一个着色器对象绑定到一个程序对象 void glAttachShader(GLuint program, ...
- oracle 在存储过程或函数中得到异常sql
BEGIN SQLSTR := 'UPDATE TBL ...'; EXECUTE IMMEDIATE SQLSTR; EXCEPTION WHEN OTHERS INSERT INTO LOG_TA ...