创建一个可操作的主角

将人物图片变成unity中的物件

  1. 创建人物

两个方法:

  • 直接将图片拖进Scene
  • 创建一个sprite,再拖到sprite里

*sprite Renderer可以将图形渲染

  1. 添加相关组件

在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;}}}

创建一个可操作的主角相关推荐

  1. UE4-如何做一个简单的TPS角色(一)-创建一个基础角色

    打开UE4进入创建项目界面,选择游戏,第三人称项目进入下一步 按照以下配置创建一个项目,命名任意,一定要包含初学者内容!!!关系到后面素材使用 项目创建完成后,先创建一个Level文件夹,在文件夹中创 ...

  2. Unity3D 创建一个简单的2D游戏

    http://www.cnblogs.com/sunxun/p/4889462.html 开始研究Unity3d 中的2D游戏. 首先创建出一个项目: 然后创建出一个场景: 然后添加一个背景: 然后创 ...

  3. 使用HTML5的Canvas和raycasting创建一个伪3D游戏(part1)

    使用HTML5的Canvas和raycasting创建一个伪3D游戏(part1) 刚来这找到一篇好文,自己翻译了下:(原文:http://dev.opera.com/articles/view/cr ...

  4. linux创建一个交换分区,如何创建linux交换分区

    匿名用户 1级 2017-03-26 回答 1.mkswap 把一个分区格式化成为swap交换区: [root@localhost]# mkswap /dev/sda6 注:创建此分区为swap 交换 ...

  5. 创建一个Scalar-valued Function函数来实现LastIndexOf

    昨天有帮助网友解决的个字符串截取的问题,<截取字符串中最后一个中文词语(MS SQL)>http://www.cnblogs.com/insus/p/7883606.html 虽然实现了, ...

  6. 如何创建一个基础jQuery插件

    如何创建一个基础插件 How to Create a Basic Plugin 有时你想使一块功能性的代码在你代码的任何地方有效.比如,也许你想调用jQuery对象的一个方法,对该对象进行一系列的操作 ...

  7. 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)

    前情提示:有一天,我要实现一个效果→点击某个按钮改变一个全局变量,并且要让绑定了该变量的所有位置异步渲染.我试过用一个全局的js文件存放该变量,该变量值虽然改变了,但是没有做到异步渲染.接着我用win ...

  8. 学习在Unity中创建一个动作RPG游戏

    游戏开发变得简单.使用Unity学习C#并创建您自己的动作角色扮演游戏! 你会学到什么 学习C#,一种现代通用的编程语言. 了解Unity中2D发展的能力. 发展强大的和可移植的解决问题的技能. 了解 ...

  9. Unity与C#创建一个3D平台游戏 Learn to Create a 3D Platformer Game with Unity C#

    游戏开发变得容易了.使用Unity学习C#并创建您自己的3D平台! 你会学到什么 学习现代通用编程语言C#. 了解Unity中3D开发的功能 发展强大的可转移的解决问题的技能 了解游戏开发过程 了解面 ...

最新文章

  1. 必读!TOP10生成对抗网络GAN论文(附链接)
  2. matlab矩阵方块网络着色imshow_matlab中用imshow()显示图像与图像矩阵的数据类型的关系...
  3. 刷题总结——生日礼物(bzoj1293单调队列)
  4. 安义县农业结构调整-农业大健康·林裕豪:从玉农业谋定基地
  5. 实验9:Problem D: 从点到面
  6. flink shell的local模式(benv与senv的使用+处理报错的解决方案)
  7. cognos 7在IE7中不显示左边的树形菜单的解决
  8. CentOS卸载自带的JDK
  9. 我对于男人喜欢喷香水是觉得很恶心的一件事
  10. wps页码从指定页开始_wps怎么自动生成页码以及设置页码从第三页开始
  11. oracle append作用分析
  12. JavaScript打造很酷的图片放大效果实例代码
  13. SPI Flash/Nor Flash/Nand Flash
  14. 算法复杂性分析及运算规则证明(一)
  15. MAC使用 SVN问题
  16. 概率论4.5中心矩与原点矩
  17. 追风人拍到壮观龙卷风
  18. MySQL的数据是存在哪的
  19. 实例6:圆周率的计算
  20. linux 环境 Realplay 10.0 的安装和使用

热门文章

  1. PPC907BE 3BHE024577R0101用于工业自动化设备
  2. 连续三天熬夜次世代建模师终于出手,让老板多招女员工
  3. 女孩吐槽 IT 男:有钱自大无聊 约会竟爱谈工作
  4. 企业软文营销把什么放在第一位才能有效推广?
  5. 有什么变年轻特效的软件?这些软件值得收藏
  6. 八核机仅888元 各价位四核八核手机推荐
  7. 股权激励适合什么样的公司
  8. 人人都能开发安卓App App Inventor 2应用开发实战.pdf 免费下载(2)
  9. Mysql concat函数的使用
  10. 堆之最小堆、最大堆(java实现)