控制组件

角色控制组件和刚体组件都具备物理引擎的功能,须要绑定游戏对象才干实现对应的物理效果,而且同一个游戏对象中两者仅仅能存在一个,不能共存。刚体组件能够很精确的模拟现实世界中的一切物理效果,而角色控制器则没有那么精准。

加入角色控制器之前,须要确定是否把角色控制器标准资源包引入project,未引人是无法加入角色控制器的。在component——physics——character controller就可以加入角色控制器。

加入完后,就须要在脚本中控制角色控制器组件。首先创建一个游戏脚本,然后使用GetComponent<CharacterController>()获取角色控制器组件对象。接着通过调用SimpleMove( )方法实现角色的移动。

本例通过角色控制器组件来控制立方体对象的选择和移动,而且感应物理引擎的碰撞:

using UnityEngine;
using System.Collections; public class Script_06_05 : MonoBehaviour { //角色控制器对象
private CharacterController controller = null;
//角色的移动的速度
private float moveSpeed = 30.0f;
//角色的旋转速度
private float rotateSpeed = 3.0f; void Start()
{
//获取角色控制器对象
controller = GetComponent<CharacterController>();
} void OnGUI()
{
//控制角色旋转
if(GUILayout.RepeatButton("向左旋转"))
{
transform.Rotate(0,-rotateSpeed, 0);
}
if(GUILayout.RepeatButton("向右旋转"))
{
transform.Rotate(0,rotateSpeed, 0);
} //控制角色移动
if(GUILayout.RepeatButton("向前移动"))
{
controller.SimpleMove(Vector3.forward * moveSpeed);
}
if(GUILayout.RepeatButton("向后移动"))
{
controller.SimpleMove(Vector3.forward * -moveSpeed);
} if(GUILayout.RepeatButton("向左移动"))
{
controller.SimpleMove(Vector3.right * -moveSpeed);
}
if(GUILayout.RepeatButton("向右移动"))
{
controller.SimpleMove(Vector3.right * moveSpeed);
}
}
}

执行后:

飞行与移动

角色控制器组件还能够实现飞行和降落的功能,通过move()方法实现,当中的參数是飞行的角度。与simplemove()方法仅仅适用与平面移动不同,move()适用与全部方向的移动。

在开发中,尽量使用move方法,由于它更加灵活。以下的样例便实现立方体的起飞与降落:

using UnityEngine;
using System.Collections; public class Script_06_06 : MonoBehaviour
{ //角色控制器对象
private CharacterController controller = null;
//角色的移动的速度
private float moveSpeed = 3.0f;
//角色的旋转速度
private float rotateSpeed = 3.0f; void Start()
{
//获取角色控制器对象
controller = GetComponent<CharacterController>();
} void OnGUI()
{ //控制角色旋转
if(GUILayout.RepeatButton("向左旋转"))
{
transform.Rotate(0,-rotateSpeed, 0);
}
if(GUILayout.RepeatButton("向右旋转"))
{
transform.Rotate(0,rotateSpeed, 0);
} //控制角色移动
if(GUILayout.RepeatButton("向前移动"))
{
Vector3 forward = transform.TransformDirection(Vector3.forward);
controller.Move(forward*moveSpeed);
}
if(GUILayout.RepeatButton("向后移动"))
{
Vector3 forward = transform.TransformDirection(Vector3.forward);
controller.Move( forward*-moveSpeed);
} //控制角色飞行与降落
if(GUILayout.RepeatButton("起飞"))
{
transform.Translate(0, 1, 0);
}
if(GUILayout.RepeatButton("降落"))
{
transform.Translate(0, -1, 0); }
}
}

上述代码中,注意一点:transform.TransformDirection(  )方法得到当前主角移动时面朝的方向

执行:

点击起飞:

点击降落:

碰撞监測

角色控制器可感应游戏对象之间的碰撞,监測它们碰撞时,须要调用父类方法OnControllerColliderHit(  )方法。

using UnityEngine;
using System.Collections; public class Script_06_07 : MonoBehaviour
{ //角色控制器对象
private CharacterController controller = null;
//角色的移动的速度
private float moveSpeed = 3.0f;
//角色的旋转速度
private float rotateSpeed = 3.0f;
//碰撞的游戏对象
private GameObject colliderObj = null; void Start()
{
//获取角色控制器对象
controller = GetComponent<CharacterController>();
} void OnGUI()
{ //控制角色旋转
if(GUILayout.RepeatButton("向左旋转"))
{
transform.Rotate(0,-rotateSpeed, 0);
}
if(GUILayout.RepeatButton("向右旋转"))
{
transform.Rotate(0,rotateSpeed, 0);
} //控制角色移动
if(GUILayout.RepeatButton("向前移动"))
{
Vector3 forward = transform.TransformDirection(Vector3.forward);
controller.Move(forward*moveSpeed);
}
if(GUILayout.RepeatButton("向后移动"))
{
Vector3 forward = transform.TransformDirection(Vector3.forward);
controller.Move( forward*-moveSpeed);
} //控制角色飞行与降落
if(GUILayout.RepeatButton("起飞"))
{
transform.Translate(0, 1, 0);
}
if(GUILayout.RepeatButton("降落"))
{
transform.Translate(0, -1, 0); } //碰撞中
if(controller.collisionFlags == CollisionFlags.Sides)
{
if(colliderObj != null)
{
GUI.color = Color.black;
GUI.Label(new Rect(200,100,200,100),"碰撞的游戏对象为:" + colliderObj.name);
}
}
} void OnControllerColliderHit(ControllerColliderHit hit)
{
//得到碰撞的游戏对象
colliderObj = hit.gameObject;
}
}

执行后:

【Unity 3D】学习笔记三十九:控制组件的更多相关文章

  1. tensorflow学习笔记(三十九):双向rnn

    tensorflow 双向 rnn 如何在tensorflow中实现双向rnn 单层双向rnn 单层双向rnn (cs224d) tensorflow中已经提供了双向rnn的接口,它就是tf.nn.b ...

  2. angular学习笔记(三十)-指令(2)-restrice,replace,template

    本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: ...

  3. angular学习笔记(三十)-指令(10)-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  4. angular学习笔记(三十)-指令(7)-compile和link(2)

    继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...

  5. angular学习笔记(三十)-指令(7)-compile和link(1)

    这篇主要讲解指令中的compile,以及它和link的微妙的关系. link函数在之前已经讲过了,而compile函数,它和link函数是不能共存的,如果定义了compile属性又定义link属性,那 ...

  6. angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令

    在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...

  7. angular学习笔记(三十)-指令(5)-link

    这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...

  8. 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView

    目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...

  9. 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头

    摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ...

随机推荐

  1. django email用法

    在settings里面设置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'EMAIL_PORT = 25EMAIL_HOST ...

  2. 感觉Release有时比Debug要健壮

    评估文件夹大小的时候,直接跨线程操作UI界面,Debug崩溃,Release不崩溃. 更多的一种情况是,本机DEBUG下不崩溃,把RELEASE版本到别的机子上,立刻崩溃(登录框的进度条的对象为空,仍 ...

  3. Android 修改底部导航栏navigationbar的颜色

    Android 修改底部导航栏navigationbar的颜色 getWindow().setNavigationBarColor(Color.BLUE); //写法一 getWindow().set ...

  4. 【Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款/蓝绿色】玛萨玛索男装网购商城

    [Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款/蓝绿色]玛萨玛索男装网购商城 [特价商品] Dior风格/舒适防风面料/抗静电里衬/大身撞色拼接/精致平驳领/时尚便西款 ...

  5. SilkTest天龙八部系列7-动态对象识别

    在测试web应用时,我们常常需要面对web页面对象变化频繁,并且使用预定义方式识别对象慢的困难.为了解决这些问题,SilkTest引入了dynamic object recognition技术,它使用 ...

  6. 一步一步重写 CodeIgniter 框架 (9) —— 使用 CodeIgniter 类库

    通过前面几节的内容,我们从零开始搭建了一个非常方便的MVC框架,理解了 CodeIgniter 框架最核心的部分.然而一个框架的便利不仅仅在于提供一个MVC就可以了,它还必须具有较高的扩展性.下面将从 ...

  7. Java CopyOnWriteArrayList分析

    CopyOnWriteArrayList是一种线程安全的ArrayList,顾名思义,它会利用写时拷贝技术,它对共享对象做仅仅读操作的时候,大家都用一个共享对象,假设有可变的操作时,就会复制一份出来, ...

  8. Android平台下使用lua调用Java代码经验总结

    动态语言以其执行的灵活性,可配置性.方便调试能够为开发带来极大的方便.假设用好了.能够极大的提高开发的效率. 怪不得像游戏开发这样复杂的软件开发里没有不集成脚本语言的. 当中,lua以其小巧,灵活.方 ...

  9. 常见Linux服务器操作系统版本中自带的OpenSSL版本

    下表是常见服务器操作系统版本中自带的OpenSSL版本: 从上表可以看出,目前常用的服务器版本中,默认OpenSSL为1.0.2的只有Ubuntu 16.04 LTS.其他版本如果要升级OpenSSL ...

  10. Ajax的三种实现及JSON解析

    本文为学习笔记,属新手文章,欢迎指教!! 本文主要是比较三种实现Ajax的方式,为以后的学习开个头. 准备: 1.  prototype.js 2.  jquery1.3.2.min.js 3.  j ...