创建一个可操作的主角
创建一个可操作的主角
将人物图片变成unity中的物件
- 创建人物
两个方法:
- 直接将图片拖进Scene
- 创建一个sprite,再拖到sprite里
*sprite Renderer可以将图形渲染
- 添加相关组件
在unity游戏制作中,我们一般希望模拟物体真实的,现实生活中的反应,所以我们会为物体添加以下组件以达到我们的需求
- Rigidbody2D:为物件本身添加物理刚体,有了Rigidbody2D之后,任何力都会改变物理位置显示,所以用刚体覆盖物体 。
- 2D碰撞体 :Collider2D (人物的碰撞其实是靠它来判断)
- istrigger:将其变成一个碰撞判断体
- metiral:可添加物理性质。例如修改其弹性和摩擦力之类的
- 为了使人物运动丝滑,就我自己实验,需要为他添加三个碰撞体,分别是光滑的上半身(形状随便)、下半身(用circle碰撞体),和非光滑的脚(一个点)
人物的活动
总体逻辑:
通过获得并修改物体的参数(如其速度或坐标),并对其进行修改来得到移动的效果。
因为是模拟物理效果,所以我们最好是在FixedUpdate函数里面调用移动的函数
从unity上方Edit的projectsetting中的inputmannager可以看见和修改我们需要的Button(游戏中的指定一系列按键)或者Key(键盘按键)的名称
在代码中得到物体组件参数的方法
- 在代码中可以通过
public 组件对应的变量类型 变量名
来在inspector里面的脚本界面中得到可以接收物体组件的框,将组件拖进去就行 - private 的变量的话,就在Start或者Awake里面得到就行。
private Rigidbody2D rb; ...void Start(){rb = GetComponent<Rigidbody2D>();//然后就在后续代码中修改rb的参数就行}
2D地面移动
- 逻辑:
通过左右按键为人物更改朝向
通过朝向*预设好的速度
的方法来为人物提供正确的速度
- 动画逻辑:
设置一个浮点判定变量为人物的速度,当速度大于一个微小值(这样比较合理),判定人物移动,移动动画开始播放
public float speed;//这里是自己可以在unity编辑器里面设置的量
private bool facedirection;//默认值是false
...
void FixedUpdate(){GroundMove();//每秒50次左右被执行以判断是否移动}
...
void GroundMove(){float horizontalMove = Input.GetAxisRaw("Horizontal");//Raw返回-1,0,1,用于获得左右方向值if (horizontalMove != 0){if (horizontalMove == 1)facedirection = false;//这里是根据得到的按键方向来判断面朝方向else facedirection = true;transform.localScale = new Vector3(horizontalMove, 1, 1);//控制人物翻转}rb.velocity = new Vector2(horizontalMove * speed, rb.velocity.y);}
anim.SetFloat("running", Mathf.Abs(rb.velocity.x));//取横轴速度的绝对值
跳跃
- 逻辑:
玩家能不能起跳取决于玩家是否按下跳跃键,以及游戏设计是否允许,于是我们可以先预判定是否可以起跳
若是存在二段跳,我希望二段跳的逻辑是能在空中额外跳一次,像空洞骑士一样,而不是在如从高处掉下的浮空情况下可以跳两次,所以需要一个地面检测点
跳跃函数中,我们代码判定会从接触或不接触地面两种情况来进行,以适配在跳跃活动中的各种情况
- 动画逻辑:
当人物站在地面上,肯定是不关跳跃什么事的
不在地面时,用竖向速度的正负来进行判定上升与下降
- 跳跃相关代码如下:
public bool jumpPressed;
public bool isground;
public bool getmagic;//这个是判断角色是否能二段跳,一般是捡到道具将它改为true,方法见下文
public int jumpcount;
public Transform groundCheck;...
void Update(){if (Input.GetButtonDown("Jump") && jumpCount > 0)//判断是否按下与跳跃次数是否还有{jumpPressed = true;}
}
void FixedUpdate()
{isground = Physics2D.OverlapCircle(groundCheck.position, 0.1f, ground);//在角色脚下做一个定位点,其实也可用角色的transfo.position.y-一个测试值来代替。作用是判断它是否在地面上Jump();//既然是物理效果,当然要放在FixedUpdate里面
}
...
Jump()//可支持多段跳跃的函数
{if (isground)//判断是否在地面上{jumpCount = num;//可跳跃次数重置}if (jumpPressed && isground){rb.velocity = new Vector2(rb.velocity.x, jumpforce);jumpCount--;// 这里是提升手感的关键!!!/*我们的Jump()函数在FixedUpdate里判定,jumpPressed在Update()里面判定,下面这一句可以确保判定条件的对齐*/jumpPressed = false;}if (!isground && getMagic){if (jumpPressed){rb.velocity = new Vector2(rb.velocity.x, jumpforce);jumpCount -= 2;jumpPressed = false;}}else{jumpPressed = false;}
}
if (isground){anim.SetBool("falling", false);anim.SetBool("jumping", false);}else if (rb.velocity.y > 0){anim.SetBool("jumping", true);}else if (rb.velocity.y < 0){anim.SetBool("jumping", false);anim.SetBool("falling", true);}
下蹲
- 逻辑:
先想想,当一个人趴下的时候,他的竖向体积会减小,而我们为了人物移动的顺滑,我们会为人物添加三个碰撞体就排上用场了
上文说,人物有三个碰撞体,分别是光滑的上半身(形状随便)、下半身(用circle碰撞体),和非光滑的脚(一个点)
我们可以定义一个碰撞体组件变量,将头部碰撞体拖进去,在按下下蹲键的时候将他关闭,在放开下蹲键的时候重新启用
同时在人物蹲下钻进洞时,狭小的空间不能让人物站起来,若是这会儿玩家松开了下蹲键,不就… 嗯…
所以我们可以在人物头顶添加一个检测点,用法和地面检测点相同,当检测到头顶有墙,便不会站起
- 动画逻辑
我们的人物在正常非跳跃非受伤的状态下随时都可以下蹲
判定条件可以设置为bool,按下时true,放开false
- 下蹲代码如下:
public Transform CeilingCheck;
...
void FixedUpdate(){GroundMove();//每秒50次左右被执行以判断是否移动}
...void GroundMove()Crouch();}
...
void Crouch(){if (!Physics2D.OverlapCircle(CeilingCheck.position, 0.2f, ground)){if (Input.GetButton("crouch")){anim.SetBool("crouch", true);Discoll.enabled = false;}else{Discoll.enabled = true;}}}
创建一个可操作的主角相关推荐
- UE4-如何做一个简单的TPS角色(一)-创建一个基础角色
打开UE4进入创建项目界面,选择游戏,第三人称项目进入下一步 按照以下配置创建一个项目,命名任意,一定要包含初学者内容!!!关系到后面素材使用 项目创建完成后,先创建一个Level文件夹,在文件夹中创 ...
- Unity3D 创建一个简单的2D游戏
http://www.cnblogs.com/sunxun/p/4889462.html 开始研究Unity3d 中的2D游戏. 首先创建出一个项目: 然后创建出一个场景: 然后添加一个背景: 然后创 ...
- 使用HTML5的Canvas和raycasting创建一个伪3D游戏(part1)
使用HTML5的Canvas和raycasting创建一个伪3D游戏(part1) 刚来这找到一篇好文,自己翻译了下:(原文:http://dev.opera.com/articles/view/cr ...
- linux创建一个交换分区,如何创建linux交换分区
匿名用户 1级 2017-03-26 回答 1.mkswap 把一个分区格式化成为swap交换区: [root@localhost]# mkswap /dev/sda6 注:创建此分区为swap 交换 ...
- 创建一个Scalar-valued Function函数来实现LastIndexOf
昨天有帮助网友解决的个字符串截取的问题,<截取字符串中最后一个中文词语(MS SQL)>http://www.cnblogs.com/insus/p/7883606.html 虽然实现了, ...
- 如何创建一个基础jQuery插件
如何创建一个基础插件 How to Create a Basic Plugin 有时你想使一块功能性的代码在你代码的任何地方有效.比如,也许你想调用jQuery对象的一个方法,对该对象进行一系列的操作 ...
- 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)
前情提示:有一天,我要实现一个效果→点击某个按钮改变一个全局变量,并且要让绑定了该变量的所有位置异步渲染.我试过用一个全局的js文件存放该变量,该变量值虽然改变了,但是没有做到异步渲染.接着我用win ...
- 学习在Unity中创建一个动作RPG游戏
游戏开发变得简单.使用Unity学习C#并创建您自己的动作角色扮演游戏! 你会学到什么 学习C#,一种现代通用的编程语言. 了解Unity中2D发展的能力. 发展强大的和可移植的解决问题的技能. 了解 ...
- Unity与C#创建一个3D平台游戏 Learn to Create a 3D Platformer Game with Unity C#
游戏开发变得容易了.使用Unity学习C#并创建您自己的3D平台! 你会学到什么 学习现代通用编程语言C#. 了解Unity中3D开发的功能 发展强大的可转移的解决问题的技能 了解游戏开发过程 了解面 ...
最新文章
- 必读!TOP10生成对抗网络GAN论文(附链接)
- matlab矩阵方块网络着色imshow_matlab中用imshow()显示图像与图像矩阵的数据类型的关系...
- 刷题总结——生日礼物(bzoj1293单调队列)
- 安义县农业结构调整-农业大健康·林裕豪:从玉农业谋定基地
- 实验9:Problem D: 从点到面
- flink shell的local模式(benv与senv的使用+处理报错的解决方案)
- cognos 7在IE7中不显示左边的树形菜单的解决
- CentOS卸载自带的JDK
- 我对于男人喜欢喷香水是觉得很恶心的一件事
- wps页码从指定页开始_wps怎么自动生成页码以及设置页码从第三页开始
- oracle append作用分析
- JavaScript打造很酷的图片放大效果实例代码
- SPI Flash/Nor Flash/Nand Flash
- 算法复杂性分析及运算规则证明(一)
- MAC使用 SVN问题
- 概率论4.5中心矩与原点矩
- 追风人拍到壮观龙卷风
- MySQL的数据是存在哪的
- 实例6:圆周率的计算
- linux 环境 Realplay 10.0 的安装和使用