核心代码

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脚本】游戏开发常用功能——以平台动作游戏为例解决“瞬移穿墙”问题相关推荐

  1. 【Unity脚本】游戏开发常用功能笔记——游戏开始,失败,暂停,重开,退出游戏

    using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; /----- coded by 圈毛君 2019 ...

  2. 【Unity脚本】游戏开发常用功能——双击键盘跑步/快步

    using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> / ...

  3. Unity脚本介绍和常用API

    Unity脚本介绍和常用API 脚本介绍 1.脚本 介绍 语法结构 编译过程 2.开发工具 MonoDevelop Visual Studio 3.脚本生命周期 简介 脚本生命周期的阶段 1.初始阶段 ...

  4. Unity游戏开发——新发教你做游戏(三):3种资源加载方式

    文章目录 一.前言 二.Unity的目录结构规范 1.Resources(不是很推荐把资源放这个目录) 2.RawAssets(存放生资源) 3.GameRes(存放熟资源) 4.StreamingA ...

  5. unity游戏开发毕设_基于Unity3D射击游戏开发与实现

    摘  要 unity3D是本次毕业设计的主要的软件,这个软件以使用,医用和跨平台为主,unity还具有一个性能非常领先的游戏引擎,价值不菲,是一个完全集成的专业应用,正由于它强大的专业游戏开发引擎能大 ...

  6. 游戏分类&&游戏开发常用术语

    1. 游戏分类 游戏类型分类 ACT(Action Game) :动作游戏 纯粹的娱乐休闲,包括格斗游戏和射击游戏.具有关卡设计的横版过关游戏可以称其为动作游戏.目前的动作游戏均指传统的过关式动作游戏 ...

  7. (完结)Unity游戏开发——新发教你做游戏(七):Animator控制角色动画播放

    文章目录 一.前言 二.Animator状态机组织 三.过渡条件 四.用代码设置过渡条件,触发动画播放 五.CharacterAniLogic.cs完整代码 一.前言 文章列表 Unity游戏开发-- ...

  8. Unity游戏开发——新发教你做游戏(一):打开游戏开发新世界的大门

    文章目录 一.前言 二.制作思路 三.提出问题 四.具体实现 一.前言 嗨,大家好,我是新发,如下,我做了个简单的Demo,接下来我会详细介绍如何一步步制作,Demo工程我已上传到GitHub,感兴趣 ...

  9. 小游戏开发Laya对接主流平台(qq,抖音,vivo,oppo,微信)

    小游戏开发-Laya对接主流平台 laya对接主流平台简介(qq,抖音,vivo,oppo,微信) 全平台讲座地址: qq https://blog.csdn.net/koljy111/article ...

最新文章

  1. shiro多realm验证之——shiro实现不同身份使用不同Realm进行验证(转)
  2. c++ 优先队列_什么是队列?(Python队列)
  3. Linux软件安装的几种方法 (三)—— 源码安装
  4. 实例浅析javascript变量作用域
  5. 2010-09-11
  6. 手机运行内存越大就越好吗?4GB与8GB的差距真的很明显吗?
  7. 一个用户下表、批量授予权限给另一个用户
  8. python图形库可以干什么_安装Python图形库matplotlib
  9. PDF复制文字到Word中太过混乱的解决方法
  10. vulhub漏洞复现十七_GhostScript
  11. 计算机ftp怎么登陆新用户,ftp登录
  12. asp.net+扫描仪+图片上传
  13. AI玩Flappy Bird│基于DQN的机器学习实例【完结】
  14. transform 实现 附加鼠标悬浮效果,照片旋转,六面体,3D效果
  15. PDF文件旋转最好用的方法
  16. 微信运营营销推广方案
  17. Word如何从目录后加页码
  18. android使用google gcm接收push消息需要注意的地方
  19. 区分网络管理员和网络工程师
  20. GNOME 平台的2D图形编程(GTK,GDK,Cairo...) 简介 [转]

热门文章

  1. 可怕的KCFErrordomainCFNetWork 303
  2. 【数据结构与算法】栈与队列【C语言版】
  3. DOM初探(17)——查看元素的尺寸与位置
  4. ReferenceError: “alert” is not defined
  5. 缺少msvc140.dll解决办法,缺少任意dll文件的解决办法
  6. 三维图形变换:三维几何变换,投影变换(平行/ 透视 投影)
  7. RuoYi若依打包发布与部署
  8. 在Delphi中很精确地控制生成的WORD文档的格式
  9. 【MyBatis】 动态SQL——模糊查询 LIKE
  10. 其实特简单,Python 做一个漂亮女孩词云跳舞的视频