技术笔记:Unity洛克人移动部分源码

简介: 技术笔记:Unity洛克人移动部分源码

1 using System.Collections;


2 using System.Collections.Generic;


3 using UnityEngine;


4


5 【RequireComponent(typeof(Controller2D))】


6 public class Player : MonoBehaviour {


7 public float jumpHeight = 55;


8 public float timeToJumpApex = 22f / 60f;


9 public float moveSpeed = 60 2;


10 public float maxFallSpeed = 2402;


11 public GameObject dashShadow,dashPuf,dashBlast,wallJumpSpark;


12 int moveDirX, moveDirY, faceDir = 1;


13 int freezeCount, climbWallDir, dashCount;


14 int jumpDownCount;


15 bool isWallTurn;


16 bool tryToJump,jumpKeyHold,onWall;


17 bool tryToDash, DashKeyHold,onDash;


18 int onPlatform;


19


20 float gravity;


21 float jumpVelocity;


22 Vector3 velocity;


23


24 Controller2D controller;


25 Animator animator;


26 new SpriteRenderer renderer;


27 BoxCollider2D boxCollider;


28


29 // Start is called before the first frame update


30 void Start() {


31 controller = GetComponent();


32 animator = GetComponent();


33 renderer = GetComponent();


34 boxCollider = GetComponent();


35


36 gravity = -(2 jumpHeight / timeToJumpApex / timeToJumpApex);


37 jumpVelocity = -gravity timeToJumpApex;


38 }


39


40 private void Update() {


41 //since these states refresh each "real" frame....


42 GetMoveInput();


43 }


44


45 void GetMoveInput() {


46 if (Input.GetButtonDown("Left")) moveDirX = -1;


47 if (Input.GetButtonDown("Right")) moveDirX = 1;


48 if (Input.GetButtonDown("Up")) moveDirY = 1;


49 if (Input.GetButtonDown("Down")) moveDirY = -1;


50


51 if (!Input.GetButton("Left")) moveDirX = Input.GetButton("Right") ? 1 : 0;


52 if (!Input.GetButton("Right")) moveDirX = Input.GetButton("Left") ? -1 : 0;


53 if (!Input.GetButton("Up")) moveDirY = Input.GetButton("Down") ? -1 : 0;


54 if (!Input.GetButton("Down")) moveDirY = Input.GetButton("Up") ? 1 : 0;


55


56 if (Input.GetButtonDown("Jump")) tryToJump = true;


57 jumpKeyHold = Input.GetButton("Jump");


58


59 if (Input.GetButtonDown("Dash")) tryToDash = true;


60 DashKeyHold = Input.GetButton("Dash");


61 //DashKeyHold = true;


62


63 //moveDirX = 1;


64 if (moveDirX != 0 && freezeCount == 0) faceDir = moveDirX;


65 //print("Running!");


66 }


67


68 private void FixedUpdate() {


69 if (freezeCount == 0) {


70 if (transform.localScale.x != faceDir && (


71 animator.GetCurrentAnimatorClipInfo(0)【0】.clip.name.Equals("wallJumpLoop")


72 || animator.GetCurrentAnimatorClipInfo(0)【0】.clip.name.Equals("wallJumpPre"))) {


73 transform.localScale = new Vector3(faceDir, 1, 1);


74 animator.Play("wallJumpTurn");


75 }


76 else if ((transform.localScale.x != moveDirX) && (


77 animator.GetCurrentAnimatorClipInfo(0)【0】.clip.name.Equals("walldashjumploop")


78 || animator.GetCurrentAnimatorClipInfo(0)【0】.clip.name.Equals("walldashjumppre"))) {


79 //代码效果参考:http://hnjlyzjd.com/hw/wz_24609.html

transform.localScale = new Vector3(faceDir, 1, 1);

80 animator.Play("walldashjumpstop");


81 }


82 else transform.localScale = new Vector3(faceDir, 1, 1);


83 }


84


85 if (controller.collisions.below && velocity.y <= 0) {


86 velocity.y = 0;


87 freezeCount = 0;


88 if (onWall) OffWall(0);


89 }


90 if (controller.collisions.above && velocity.y >= 0) {


91 velocity.y = 0;


92 freezeCount = 0;


93 if (onWall) OffWall(0);


94 }


95


96 if (velocity.y > 0 && jumpKeyHold == false) {


97 //release jump key during rising


98 velocity.y = 0;


99 freezeCount = 0;


100 }


101


102 controller.collisions.below |= animator.GetBool("IsGround");


103


104 if (tryToJump) {


105 if (moveDirY == -1) {


106 StartCoroutine(JumpDown());


107 controller.collisions.below = controller.CheckGround();


108 //Off platform


109 }


110 if (controller.collisions.below) {


111 velocity.y = jumpVelocity;


112 animator.SetTrigger("jump");


113 // normal jump


114 }


115 else{


116 int wallDir = controller.CheckWall(faceDir);


117 if (wallDir != 0) {


118 if (onWall) OffWall(isWallTurn ? 2 : 1);


119 faceDir = wallDir;


120 if (DashKeyHold) {


121 OnDash();


122 faceDir = -1;


123 }


124 freezeCount = 7;


125 velocity.x = wallDir moveSpeed -1;


126 velocity.y = jumpVelocity;


127 transform.localScale = new Vector3(faceDir, 1, 1);


128 animator.SetTrigger("Walljump");


129


130 SoundManager.PlayZeroWallJump();


131


132 //generate spark


133 if (controller.CheckFoot(wallDir)) {


134 GameObject instance = Instantiate(wallJumpSpark, transform.position + Vector3.right ((Random.value > 0.5) ? 16 : 12) wallDir + Vector3.down 17, transform.rotation);


135 }


136 }


137 }


138 }


139 tryToJump = false;


140


141 if (tryToDash&& controller.collisions.below) {


142 OnDash();


143 InDashShape();


144 SoundManager.PlayZeroDash();


145 }


146 tryToDash = false;


147


148


149 if (onDash) {


150 dashCount++;


151 if (DashKeyHold) {


152 if (controller.collisions.below) moveDirX = faceDir;


153 else BackShape();


154


155 if (controller.collisions.below) {


156 if (dashCount >= 30) {


157 OffDash();


158 BackShape();


159 }


160 }


161 }


162 else {


163 if (controller.collisions.below) {


164 OffDash();


165 BackShape();


166 }


167 else {


168 BackShape();


169 }


170 }


171 GameObject instance =<span style="color:

相关文章
|
2月前
|
开发者 图形学 Java
揭秘Unity物理引擎核心技术:从刚体动力学到关节连接,全方位教你如何在虚拟世界中重现真实物理现象——含实战代码示例与详细解析
【8月更文挑战第31天】Unity物理引擎对于游戏开发至关重要,它能够模拟真实的物理效果,如刚体运动、碰撞检测及关节连接等。通过Rigidbody和Collider组件,开发者可以轻松实现物体间的互动与碰撞。本文通过具体代码示例介绍了如何使用Unity物理引擎实现物体运动、施加力、使用关节连接以及模拟弹簧效果等功能,帮助开发者提升游戏的真实感与沉浸感。
39 1
|
2月前
|
安全 Linux 图形学
Linux平台Unity下RTMP|RTSP低延迟播放器技术实现
本文介绍了在国产操作系统及Linux平台上,利用Unity实现RTMP/RTSP直播播放的方法。通过设置原生播放模块的回调函数,可将解码后的YUV数据传递给Unity进行渲染,实现低延迟播放。此外,还提供了播放器启动、参数配置及停止的相关代码示例,并概述了如何在Unity中更新纹理以显示视频帧。随着国产操作系统的发展,此类跨平台直播解决方案的需求日益增长,为开发者提供了灵活高效的开发方式。
|
2月前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
66 0
|
2月前
|
图形学 机器学习/深度学习 人工智能
颠覆传统游戏开发,解锁未来娱乐新纪元:深度解析如何运用Unity引擎结合机器学习技术,打造具备自我进化能力的智能游戏角色,彻底改变你的游戏体验——从基础设置到高级应用全面指南
【8月更文挑战第31天】本文探讨了如何在Unity中利用机器学习增强游戏智能。作为领先的游戏开发引擎,Unity通过ML-Agents Toolkit等工具支持AI代理的强化学习训练,使游戏角色能自主学习完成任务。文章提供了一个迷宫游戏示例及其C#脚本,展示了环境观察、动作响应及奖励机制的设计,并介绍了如何设置训练流程。此外,还提到了Unity与其他机器学习框架(如TensorFlow和PyTorch)的集成,以实现更复杂的游戏玩法。通过这些技术,游戏的智能化程度得以显著提升,为玩家带来更丰富的体验。
40 0
|
2月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
40 0
|
4月前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
170 2
|
4月前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
62 0
|
4月前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
60 0
|
4月前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
46 0
|
4月前
|
存储 图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版11(附带项目源码)
65 0
下一篇
无影云桌面