【Unity脚本】游戏开发常用功能——以平台动作游戏为例解决“瞬移穿墙”问题
核心代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Author:圈毛君
/// MoveController:2019/10/18 20:50
/// </summary>
public class PlayerController : MonoBehaviour
{public float exStepDistance = 3.0f; // 瞬步距离(速度)private bool exStepEnabled = true; // 能否使用瞬步public void MoveController(){if (Input.GetKey(KeyCode.A)){if (Input.GetKeyDown(KeyCode.LeftShift) && exStepEnabled){float tempStepDistance = exStepDistance; // 临时瞬步距离Vector3 temp = transform.position;RaycastHit2D hit = Physics2D.Raycast(new Vector2(temp.x - 0.6f, temp.y), new Vector2(-1, 0), exStepDistance); // 使用Raycast解决穿墙问题if (hit){// 仅通过Raycast判断还不能解决贴墙穿越的问题,需要在碰撞事件中进一步处理tempStepDistance = hit.distance; // 重新赋值瞬步距离}transform.position = new Vector3(-tempStepDistance + temp.x, temp.y, temp.z); // 虽然可以瞬步,但要解决穿墙的BUG}}private void OnCollisionEnter2D(Collision2D collision){if(collision.gameObject.name != "Floor") // 某些物体的碰撞不可计算在内{exStepEnabled = false;}}private void OnCollisionStay2D(Collision2D collision){if (collision.gameObject.name != "Floor"){exStepEnabled = false;}}private void OnCollisionExit2D(Collision2D collision){if (collision.gameObject.name != "Floor"){exStepEnabled = true;}}
}
完整移动代码(包括A/D步行、双击A/D跑步、A/D+Shift瞬移)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Author:圈毛君
/// MoveController:2019/10/18 20:50
/// </summary>
public class PlayerController : MonoBehaviour
{public float walkSpeed = 3.0f; // 步行速度public float runSpeed = 5.0f; // 跑步速度public float pressInterval = 0.5f; // 双击按键的有效时间间隔public float exStepDistance = 3.0f; // 瞬步距离(速度)private Rigidbody2D rgb;private SpriteRenderer sr;private Color originColor;private float pressATime; // 按下A键时间private float pressDTime;private float releaseATime = .0f; // 松开A键时间private float releaseDTime = .0f;private bool exStepEnabled = true; // 能否使用瞬步private void Awake(){rgb = this.GetComponent<Rigidbody2D>();sr = this.GetComponent<SpriteRenderer>();originColor = sr.color;}private void Update(){MoveController(); // 移动控制}public void MoveController(){if (Input.GetKeyUp(KeyCode.A)) // 不能||D,否则快速AD也算双击有效时间{releaseATime = Time.time;sr.color = originColor;rgb.velocity = new Vector2(0, 0); // Stop}if (Input.GetKeyUp(KeyCode.D)){releaseDTime = Time.time;sr.color = originColor;rgb.velocity = new Vector2(0, 0);}if (Input.GetKey(KeyCode.A)){if (Input.GetKeyDown(KeyCode.LeftShift) && exStepEnabled){float tempStepDistance = exStepDistance; // 临时瞬步距离Vector3 temp = transform.position;RaycastHit2D hit = Physics2D.Raycast(new Vector2(temp.x - 0.6f, temp.y), new Vector2(-1, 0), exStepDistance); // 使用Raycast解决穿墙问题if (hit){// 仅通过Raycast判断还不能解决贴墙穿越的问题,需要在碰撞事件中进一步处理tempStepDistance = hit.distance; // 重新赋值瞬步距离}transform.position = new Vector3(-tempStepDistance + temp.x, temp.y, temp.z); // 虽然可以瞬步,但要解决穿墙的BUG}pressATime = Time.time;if(pressATime - releaseATime <= pressInterval){rgb.velocity = new Vector2(-runSpeed, 0); // 跑步sr.color = new Color(1, 0, 0);releaseATime = Time.time; // 跑步状态中要持续更新松键时间}elsergb.velocity = new Vector2(-walkSpeed, 0); // 步行}if (Input.GetKey(KeyCode.D)){if (Input.GetKeyDown(KeyCode.LeftShift) && exStepEnabled){float tempStepDistance = exStepDistance;Vector3 temp = transform.position;RaycastHit2D hit = Physics2D.Raycast(new Vector2(temp.x + 0.6f, temp.y), new Vector2(1, 0), exStepDistance);if (hit){tempStepDistance = hit.distance;}transform.position = new Vector3(tempStepDistance + temp.x, temp.y, temp.z);}pressDTime = Time.time;if (pressDTime - releaseDTime <= pressInterval){rgb.velocity = new Vector2(runSpeed, 0);sr.color = new Color(1, 0, 0);releaseDTime = Time.time;}elsergb.velocity = new Vector2(walkSpeed, 0);}}private void OnCollisionEnter2D(Collision2D collision){if(collision.gameObject.name != "Floor") // 某些物体的碰撞不可计算在内{exStepEnabled = false;}}private void OnCollisionStay2D(Collision2D collision){if (collision.gameObject.name != "Floor"){exStepEnabled = false;}}private void OnCollisionExit2D(Collision2D collision){if (collision.gameObject.name != "Floor"){exStepEnabled = true;}}
}
【Unity脚本】游戏开发常用功能——以平台动作游戏为例解决“瞬移穿墙”问题相关推荐
- 【Unity脚本】游戏开发常用功能笔记——游戏开始,失败,暂停,重开,退出游戏
using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; /----- coded by 圈毛君 2019 ...
- 【Unity脚本】游戏开发常用功能——双击键盘跑步/快步
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> / ...
- Unity脚本介绍和常用API
Unity脚本介绍和常用API 脚本介绍 1.脚本 介绍 语法结构 编译过程 2.开发工具 MonoDevelop Visual Studio 3.脚本生命周期 简介 脚本生命周期的阶段 1.初始阶段 ...
- Unity游戏开发——新发教你做游戏(三):3种资源加载方式
文章目录 一.前言 二.Unity的目录结构规范 1.Resources(不是很推荐把资源放这个目录) 2.RawAssets(存放生资源) 3.GameRes(存放熟资源) 4.StreamingA ...
- unity游戏开发毕设_基于Unity3D射击游戏开发与实现
摘 要 unity3D是本次毕业设计的主要的软件,这个软件以使用,医用和跨平台为主,unity还具有一个性能非常领先的游戏引擎,价值不菲,是一个完全集成的专业应用,正由于它强大的专业游戏开发引擎能大 ...
- 游戏分类&&游戏开发常用术语
1. 游戏分类 游戏类型分类 ACT(Action Game) :动作游戏 纯粹的娱乐休闲,包括格斗游戏和射击游戏.具有关卡设计的横版过关游戏可以称其为动作游戏.目前的动作游戏均指传统的过关式动作游戏 ...
- (完结)Unity游戏开发——新发教你做游戏(七):Animator控制角色动画播放
文章目录 一.前言 二.Animator状态机组织 三.过渡条件 四.用代码设置过渡条件,触发动画播放 五.CharacterAniLogic.cs完整代码 一.前言 文章列表 Unity游戏开发-- ...
- Unity游戏开发——新发教你做游戏(一):打开游戏开发新世界的大门
文章目录 一.前言 二.制作思路 三.提出问题 四.具体实现 一.前言 嗨,大家好,我是新发,如下,我做了个简单的Demo,接下来我会详细介绍如何一步步制作,Demo工程我已上传到GitHub,感兴趣 ...
- 小游戏开发Laya对接主流平台(qq,抖音,vivo,oppo,微信)
小游戏开发-Laya对接主流平台 laya对接主流平台简介(qq,抖音,vivo,oppo,微信) 全平台讲座地址: qq https://blog.csdn.net/koljy111/article ...
最新文章
- shiro多realm验证之——shiro实现不同身份使用不同Realm进行验证(转)
- c++ 优先队列_什么是队列?(Python队列)
- Linux软件安装的几种方法 (三)—— 源码安装
- 实例浅析javascript变量作用域
- 2010-09-11
- 手机运行内存越大就越好吗?4GB与8GB的差距真的很明显吗?
- 一个用户下表、批量授予权限给另一个用户
- python图形库可以干什么_安装Python图形库matplotlib
- PDF复制文字到Word中太过混乱的解决方法
- vulhub漏洞复现十七_GhostScript
- 计算机ftp怎么登陆新用户,ftp登录
- asp.net+扫描仪+图片上传
- AI玩Flappy Bird│基于DQN的机器学习实例【完结】
- transform 实现 附加鼠标悬浮效果,照片旋转,六面体,3D效果
- PDF文件旋转最好用的方法
- 微信运营营销推广方案
- Word如何从目录后加页码
- android使用google gcm接收push消息需要注意的地方
- 区分网络管理员和网络工程师
- GNOME 平台的2D图形编程(GTK,GDK,Cairo...) 简介 [转]
热门文章
- 可怕的KCFErrordomainCFNetWork 303
- 【数据结构与算法】栈与队列【C语言版】
- DOM初探(17)——查看元素的尺寸与位置
- ReferenceError: “alert” is not defined
- 缺少msvc140.dll解决办法,缺少任意dll文件的解决办法
- 三维图形变换:三维几何变换,投影变换(平行/ 透视 投影)
- RuoYi若依打包发布与部署
- 在Delphi中很精确地控制生成的WORD文档的格式
- 【MyBatis】 动态SQL——模糊查询 LIKE
- 其实特简单,Python 做一个漂亮女孩词云跳舞的视频