Unity 2d 雷区与小怪的生成
>>点击此处返回查看前面的内容
目录
创建一个机器人对象
为机器人建立动画
Right是由Left翻转得到的
逐一修改帧数
创建一个新混合树
添加上下左右四个运动
添加参数
创建机器人控制脚本
冻结旋转
创建预制体
创建雷区
拖动一个素材,重命名为Robot,以
创建一个机器人对象
为机器人建立动画
双击打开
角色拖入
设定帧数率
同理,已有Down,现制作Up,Left和Right
命名技巧:点击上面的文件名,然后稍微修改一下
Right是由Left翻转得到的
所以需要对其进行处理
单独选择该动画是无法添加属性的,必须在对象上进行操作才可以
在动画面板中
逐一修改帧数
删除这四个动画状态
创建一个新混合树
添加上下左右四个运动
添加参数
修改树的类型还有参数
上 Y 1
下 Y -1
左 X -1
右 X 1
创建机器人控制脚本
机器人要有碰撞,所以为机器人添加刚体和碰撞体
刚体里面重力影响取消掉
编辑碰撞盒
继续写脚本
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;public class RobotControl : MonoBehaviour {public float speed = 3f;//机器人要运动肯定要有一个速度Animator anim;//创建一个动画状态集的变量,用来设定动画状态集的值,利用Animator参数,要决定到底播放左边的动画还是右边的动画Rigidbody2D rbody;//为了防止角色抖动,用刚体的moveposition来确定位置public bool isVertical;//设定一个参数,判断是水平移动还是垂直移动Vector2 moveDirection;//设定一个运动方向的变量float changeTimer;//设定一个计时器,每过一段时间,机器人换一个方向运动public float changeDirectionTime = 2f;//计时器长度// Start is called before the first frame updatevoid Start(){anim = GetComponent<Animator>();//获取动画组件,一会儿要修改它的参数rbody = GetComponent<Rigidbody2D>();//获取2d刚体,一会儿要修改它的位置moveDirection = isVertical ? Vector2.up : Vector2.right;//初始状态下判断运动方向changeTimer = changeDirectionTime;//计时器初始化}// Update is called once per framevoid Update(){changeTimer -= Time.deltaTime;//计时器每一帧都减小if(changeTimer<0){moveDirection *= -1;//如果小于0,改变方向changeTimer = changeDirectionTime;//改变方向后计时器重新初始化}Vector2 position = rbody.position;//定义一个二维向量位置坐标来获取刚体坐标position.x += moveDirection.x * speed * Time.deltaTime;//改变水平方向位置position.y += moveDirection.y * speed * Time.deltaTime;//改变垂直方向位置rbody.MovePosition(position);//为了防止抖动,调用刚体的moveposition,里面是二维向量的位置//设定动画状态集的参数,把moveDirection的值传递给move X/Yanim.SetFloat("move X", moveDirection.x);anim.SetFloat("move Y", moveDirection.y);} }
脚本编辑好之后绑定到角色上面
机器人只能原地变换方向,没有位移,好奇怪
错误代码:
不是 moveDirection.x 而是 position.x
moveDirection.x += moveDirection.x * speed * Time.deltaTime;//改变水平方向位置 moveDirection.y += moveDirection.y * speed * Time.deltaTime;//改变垂直方向位置
机器人撞树翻了,然后一直旋转的解决方法
冻结旋转
创建预制体
先建一个,再以它再建一个变体,调整一下方向,这样就有两个方向的怪
创建雷区
先把这两个机器人藏起来
现在就是要让玩家踩到雷区,然后让两个怪再出来
创建
把预制体文件夹放进去
编辑 PlayerControl.cs 脚本
using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine;public class PlayerControl : MonoBehaviour {public float speed = 8f;Rigidbody2D rbody;//定义2d刚体Animator anim;//定义动画Vector2 lookDirection = new Vector2(1, 0);//初始向x看GameObject robotObj;//定义一个机器人对象// Start is called before the first frame updatevoid Start(){rbody = GetComponent<Rigidbody2D>();//获取2d刚体anim = GetComponent<Animator>();//获取动画组件}// Update is called once per framevoid Update(){float moveX = Input.GetAxisRaw("Horizontal");float moveY = Input.GetAxisRaw("Vertical");Vector2 moveVector = new Vector2(moveX, moveY);if(moveX!=0||moveY!=0){lookDirection = moveVector;}Vector2 position = transform.position;position.x += moveX * speed * Time.deltaTime;position.y += moveY * speed * Time.deltaTime;transform.position = new Vector2(position.x, position.y);rbody.MovePosition(position);//用刚体移动可以消除画面抖动anim.SetFloat("move X",lookDirection.x);//为动画集赋值anim.SetFloat("move Y",lookDirection.y);anim.SetFloat("runspeed", moveVector.magnitude);//状态集的切换由运动矢量决定//赋值必须与状态集命名一样}private void OnTriggerEnter2D(Collider2D collision){float robotX = Random.Range(-3, 5);float robotY = Random.Range(-3, 5);Vector2 position_robot = new Vector2(robotX, robotY);if(collision.gameObject.tag=="bomb")//如果碰到雷区{print("other.tag=" + collision.gameObject.tag);//这句一定要有,不然出不来robotObj = Instantiate(Resources.Load("Prefabs/Robot"),position_robot,Quaternion.identity)as GameObject;//加载资源,生成一个预制体,做成一个对象}}private void OnTriggerExit2D(Collider2D collision){if(collision.gameObject.tag=="bomb"){Destroy(robotObj);}} }
复制路径
预制体路径 Assets / Resources / Prefabs / Robot.prefab robotObj=Instantiate(Resources.Load(""))//加载资源用预制体克隆一个对象 >>删去不必要的路径 robotObj = Instantiate(Resources.Load("Assets / Resources / Prefabs / Robot.prefab")); >> robotObj = Instantiate(Resources.Load("Prefabs / Robot")); >>填写其他参数,如随机生成的位置,还有方向,去掉空格 robotObj = Instantiate(Resources.Load("Prefabs/Robot"),position_robot,Quaternion.identity)as GameObject;
若路径不对会有如下报错
The Object you want to instantiate is null.
为雷区对象设定标签bomb
为雷区添加碰撞体
并指定为触发器
效果:
如果从雷区里出来了,就把机器人销毁掉
private void OnTriggerExit2D(Collider2D collision){if(collision.gameObject.tag=="bomb"){Destroy(robotObj);}}
(完)
Unity 2d 雷区与小怪的生成相关推荐
- Unity 2d自动寻路 小怪追人
首先要导入一个包 Unity 2D寻路插件 >>点此下载 一.寻路网格的生成 先搭建好场景 在搭建好的场景中新建一个空物体 点击 AddComponent 搜索 Pathfinder 添加 ...
- Unity 2D游戏开发教程之为游戏场景添加多个地面
Unity 2D游戏开发教程之为游戏场景添加多个地面 为游戏场景添加多个地面 显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的.那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面. ...
- Unity 2D游戏开发快速入门(内部资料)
Unity 2D游戏开发快速入门(内部资料) 试读样张:http://pan.baidu.com/s/1hqh5oqw Unity 2D游戏开发快速入门4 前 言 Unity是一款综合的游戏开发工具 ...
- Unity 2D教程: 滚动,场景和音效
http://www.tairan.com/archives/7074 原文地址:http://www.raywenderlich.com/71029/unity-4-3-2d-tutorial-sc ...
- Unity 2D骨骼动画2:创建真实动画
http://bbs.9ria.com/thread-401781-1-1.html 在这个系列,我们将关注Unity引擎提供的基于骨骼动画工具.它的主要思想是为了把它应用到你自己的游戏来介绍和教基本 ...
- Unity 2D光照(2D Light)和阴影(Shadow Caster 2D)
前言 在上一篇我们简单了了解了Unity 2D动画的实现,在这一篇中,我们来学一下Unity的2D Light,给我们的2D动画添加上光照效果,简单的效果图如下: 首先先分享一个B站上别人翻译了的视频 ...
- UNITY 2D入门基础教程 (一)
如果用以前版本的Unity做2D游戏,虽然能做,但是要费很多周折. 比如你可以将一张纹理赋予一个"面片"网格,然后用脚本控制它的动画调整它的位移.如果你要使用物理引擎,那么还要将这 ...
- 【Unity】Unity 2D游戏开发(一)U2D基础功能
文章目录 Unity 2D游戏开发基础知识 Animation动画 SortingLayer层排序 Physics 2D物理2D Rigidbody 2D刚体 示例 1.点击鼠标发出子弹 2.子弹打中 ...
- 《Unity 2D与3D手机游戏开发实战》简介
#好书推荐##好书奇遇季#<Unity 2D与3D手机游戏开发实战>,京东当当天猫都有发售.彩色印制,定价89元,网店打折销售更便宜.本书配套源码.PPT课件,适合Unity游戏开发初学者 ...
最新文章
- [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历
- python延迟5s_Python做扫描,发包速度实在是太慢了,有优化的方案吗?
- javascript学习系列(20):数组中的bind,apply,call
- 瞎扯数学分析-微积分
- JavaScript基础知识必知!
- c++ 中文 base64加密_这次有点骚了,破解安卓某 APP 低层加密
- Python多进程(process)和多线程(thread)的区别
- java—将数据库读取的list转tree
- NYOJ 81:炮兵阵地(状压DP)
- ADFS3.0 Customizing the AD FS Sign-in Pages
- js href的用法
- 设计模式(8)——外观模式
- 服务器2012能安装无线网卡,网件无线网卡在windows 2012支持问题
- 系统架构师论文-论新技术的引进
- 个人创建微信公众号步骤
- 符号_变压器电路图符号大全
- 用凯利公式玩转炒股,一文全懂
- Spring data报错:Inferred type 'S' for type parameter 'S' is not within its bound;
- Java使用三层架构、JDBC连接数据库完成《试题信息管理系统》
- iOS-音频 + 视频