Unity3D新手教学,让你十二小时,从入门到掌握!(三 ) [转]
版权声明:本文为Aries原创文章,转载请标明出处。如有不足之处欢迎提出意见或建议,联系QQ531193915
这一讲,我会教大家如何写碰撞检测的代码,然后还会教大家如何使用我介绍给大家的第一个Unity的插件。
那么,废话不多说,我先介绍插件如何下载和安装。
进入这个页面,按编译器版本进行下载,我用的是2010,所以要下载这个。
安装就不用我教了,下面开始看我是如何导入Unity VS的。
点击Import之后我们会发现并没有发生什么,但是接下来我们按一下刷新的快捷键:Ctrl+F(F:Flush)就会看到上面多出来一个东西。
点击Open以后就会自动打开VS了。
OK,插件安装完毕,接下来教大家如何做碰撞检测。
发生碰撞需要两个条件,碰撞体要一个具有刚体,一个具有碰撞器。
上一讲我们已经为Cube添加了碰撞器,并且选择了Is Trigger的触发器,那么我们现在开始编写碰撞检测的代码。
在Scripts文件夹下新建一个名为PlayerCollision的C#脚本。
在写代码之前,我要介绍一下碰撞检测有好多种:
OnTriggerEnter( Collider other )当进入触发器
OnTriggerExit( Collider other )当退出触发器
OnTriggerStay( Collider other )当逗留触发器
OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
OnCollisionStay( Collision collisionInfo ) 当逗留碰撞器
以上这六个方法都是MonoBehaviour里面的,因为我们的脚本都是继承的MonoBehaviour这个类。所以我们的脚本里面可以覆盖这六个方法。
因为我们勾选了Is Trigger,所以,我们覆盖OnTriggerEnter( Collider other )方法:
//当进入碰撞器的方法
public void OnTriggerEnter(Collider other)
{
//如果碰撞的GameObject不是Floor
if(!other.gameObject.name.Equals("Floor"))
{
print("报告主人:触发器成功触发!");
}
}
然后,将这段代码托给Player,运行游戏。
如图所示,碰撞的确发生了,但是Player却穿过了Cube。
这并不是一个好现象!!!
那么,我们换另一个方法,将碰撞器的Is Trigger取消。
然后再将代码改为:
public void OnCollisionEnter(Collision other)
{
//如果碰撞的GameObject不是Floor
if (!other.gameObject.name.Equals("Floor"))
{
print("报告主人:触发器成功触发!");
}
}
那么,这时候可能有人会问我,刚开始我导入的插件又有什么用呢?
现在我给大家介绍一下,我最喜换这个插件其中的一个最喜欢的功能!
在VS里编辑代码的时候,我们按下快捷键Ctrl+Shift+Q会弹出一个框框。
这里包括了我们继承了MonoBehaviour里面的所有的类。
我们在里面输入On为示范,他会自动为我们索引出一切有关On的方法:
是不是很好用呢?
那么现在我们碰撞检测可以实现了,我们应该怎么实现落在Cube上的时候使Cube停止运动呢?
随便问一个不懂编程的人都会说,让他不能动不就动不了了。
对啊,我们将Cube运动的代码取消不就不能运动了,那么我们该如何在游戏运行的时候取消Cube运动的代码呢?
我们将LeftCube移动到Floor前面。只要在发生碰撞的时候我们这么写:
public void OnCollisionEnter(Collision other)
{
//定义一个字符串
string CollisionName;
//如果碰撞的GameObject不是Floor
if (!other.gameObject.name.Equals("Floor"))
{
//将碰撞体的名字存在字符串中
CollisionName = other.gameObject.name;
//如果碰撞体的名字是LeftCube
if(CollisionName.Equals("LeftCube"))
{
//获取LeftCube身上的LeftCubeMove脚本,并切取消此代码的执行。
other.gameObject.GetComponent<LeftCubeMove>().enabled = false;
}
}
}
这时我们再运行游戏,并使Player与LeftCube发生碰撞.:
可以看到,在碰撞的一瞬间,Cube不移动了,并且右边LeftCubeMove的脚本被取消了。
这样我们是否就可以做到落在Cube上就停止他的运动了呢?
并不然!
我们总不能每发生碰撞都判断一下碰撞体的名称然后再进行取消脚本吧。
还记得在第二讲我曾经说过:(总不会写两个吧?向左一个单独的代码,向右一个单独的代码?)
现在,我来解决这个问题。
马上新建一个命为CubeMove的C#脚本。代码如下:
public class CubeMove : MonoBehaviour {
//定义Cube的初始速度
public float Speed = 1f;
void Start () {
}
void Update () {
//如果脚本所在模型的名字为LeftCube(Clone)或LeftCube
if (this.gameObject.name.Equals("LeftCube(Clone)") || this.gameObject.name.Equals("LeftCube"))
{
//执行移动方法
MoveLeft();
}
if (this.gameObject.name.Equals("RightCube(Clone)") || this.gameObject.name.Equals("RightCube"))
{
MoveRight();
}
if (this.gameObject.name.Equals("StaticCube(Clone)") || this.gameObject.name.Equals("StaticCube"))
{
MoveStop();
}
}
//定义移动方法
void MoveLeft()
{
//使Cube的移动速度递增
Speed += 0.1f;
//移动
this.transform.Translate(Vector3.left * Speed * Time.deltaTime);
}
void MoveRight()
{
Speed += 0.1f;
this.transform.Translate(Vector3.right * Speed * Time.deltaTime);
}
void MoveStop()
{
this.transform.Translate(0,0,0);
}
}
这样,我们所有可经过的Cube就都可以公用一个脚本了。
我们将所有Cube单独控制移动的代码都取消掉,然后将CubeMove的脚本托给所有Cube,别忘了StaticCube也要给。
然后我们修改一下PlayerCollision脚本的代码:
//当进入碰撞器的方法
public void OnCollisionEnter(Collision other)
{
//如果碰撞的GameObject不是Floor
if (!other.gameObject.name.Equals("Floor"))
{
//取消碰撞体上的CubeMove方法
other.gameObject.GetComponent<CubeMove>().enabled = false;
}
}
这样,我们就可以简化代码,并且便于管理,而且任何人都能看懂你的代码!
谢谢的大家的关注,那么这一讲就到此结束,下一讲我会讲解如何使Player落在Cube上时出现下一个Cube。
Unity3D新手教学,让你十二小时,从入门到掌握!(一 )
Unity3D新手教学,让你十二小时,从入门到掌握!(二 )
Unity3D新手教学,让你十二小时,从入门到掌握!(三 ) [转]的更多相关文章
- Unity3D新手教学,让你十二小时,从入门到掌握!(二) [转]
版权声明:本文为Aries原创文章,转载请标明出处.如有不足之处欢迎提出意见或建议,联系QQ531193915 继续上一讲的内容,首先呢, 为了接下来要做的小游戏,在这里我要小小的修改一下移动的代码. ...
- J2EE进阶(十二)SSH框架整合常见问题汇总(三)
在挂失用户时,发现userid值为空,但是在前台输入处理账号22时,通过后台输出可以看出,后台根据前端输入在数据库中查询到结果对象并输出该对象的userid,而且Guashi对象也获取到了其值. 解决 ...
- Unity3D新手教学,让你十二小时,从入门到掌握!(一) [转]
http://blog.csdn.net/aries_h/article/details/47307799 版权声明:本文为Aries原创文章,转载请标明出处.如有不足之处欢迎提出意见或建议,联系QQ ...
- Unity3D脚本中文系列教程(十二)
http://dong2008hong.blog.163.com/blog/static/4696882720140313545332/ GameObject类,继承自Object Unity场景中所 ...
- Linux 命令详解(十二)Systemd 入门教程:使用定时器发送邮件(mail)
Systemd 定时器教程:http://www.ruanyifeng.com/blog/2018/03/systemd-timer.html 一.定时任务 Systemd 定时任务:每小时发送一封电 ...
- Util应用程序框架公共操作类(十二):Lambda表达式公共操作类(三)
今天在开发一个简单查询时,发现我的Lambda操作类的GetValue方法无法正确获取枚举类型值,以至查询结果错误. 我增加了几个单元测试来捕获错误,代码如下. /// <summary> ...
- ios基础篇(十二)——UINavgationController的使用(三)ToolBar
UIToolBar存在于UINavigationController导航栏控制器中,而且默认被隐藏:设置UINavigationController的toolbarHidden属性可显示UIToolB ...
- javaweb学习总结(三十二)——JDBC学习入门
一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...
- avaweb(三十二)——JDBC学习入门
一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...
随机推荐
- Java synchronized的原理解析
开始 类有一个特性叫封装,如果一个类,所有的field都是private的,而且没有任何的method,那么这个类就像是四面围墙+天罗地网,没有门.看起来就是一个封闭的箱子,外面的进不来,里面的出不去 ...
- eclipse JavaEE的配置
Eclipse IDE for Java EE Developers(win32) 下载地址:http://mirror.bjtu.edu.cn/eclipse/technology/epp/down ...
- Contains,Exists,Any,Count 比较是否存在某个元素
private static void Main(string[] args) { ; Console.WriteLine("判断是否存在某个元素 :"); Console.Wri ...
- 选项卡栏控制器(UITabBarController)
选项卡栏控制器管理的每个场景都包含一个UITabBarItem,它包含标题.图像和徽章. 在场景里可以通过tabBarItem属性来获得UITabBarItem的引用.例如:[self.tabBarI ...
- Hibernate 单项一对多的关联映射
在上一篇中我们简单介绍了多对一的关联映射,本文介绍hibernate中一对多的关联映射. 1.设计表结构 虽然关联关系由多对一变为一对多,但是我们表结构不会发生改变,只是指向变了. 2.创建stude ...
- Problem E: 深入浅出学算法006-求不定方程的所有解
Description 现有一方程ax+by=c,其中系数a.b.c均为整数,求符合条件的所有正整数解,要求按x由小到大排列,其中a b c 均为不大于1000的正整数 Input 多组测试数据,第一 ...
- 【原创】Eclipse导入Android项目报错解决
1.点击报错的项目--->右键--->Properties--->选择Android--->将Project Build Target选择其一勾上-->Is Librar ...
- csv文件导入到mysql
如何将csv文件导入到mysql数据库呢,方法有很多但最简单粗暴的方法还是用sql语句啦,像下面这样. LOAD DATA LOCAL INFILE 'csv文件路径' INTO TABLE 数据表名 ...
- Linux知识(5)----LINUX下GDB调试
命令 解释 示例 file 加载被调试的可执行程序文件.因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample r c Run的简 ...
- 转:IntelliJ IDEA 2016.1.3注册破解激活
IntelliJ IDEA 2016.1.3下载地址 https://download.jetbrains.8686c.com/idea/ideaIU-2016.1.3.exe 用注册码激活: 激活码 ...