控制组件

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

加入角色控制器之前,须要确定是否把角色控制器标准资源包引入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. Python基础1:一些小知识汇总

    一.#!usr/bin/env python 脚本语言的第一行,指定执行脚本的解释器. #!/usr/bin/python 是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器 ...

  2. 利用Tomcat的用户名和密码构建“永久”后门

    从本案例中可以学到: (1)关于JSP的一些基础知识 (2)利用Tomcat的用户名和密码来构建后门 本文首先要感谢<黑客手册>“非安全.后生”编辑为本为提供了帮助,还要感谢网友“伤心的鱼 ...

  3. 获取java byte的无符号数值

    byte a = (byte)234; System.out.println(a); 上面的代码,结果是-22,因为java中byte是有符号的,byte范围是-128~127. 如果想输出234,该 ...

  4. 举例android项目中的string.xml出现这个The character reference must end with the ';' delimiter.错误提示的原因及解决办法

    今天在一个android项目中的string.xml中写这样一个字符串时出现了下面这个错误提示: The reference to entity "说明" must end wit ...

  5. MIT 三课程

    mit三课程: Introduction to Computer Science and Programming artificial intelligence introduction to alg ...

  6. [转]CentOS下性能监测工具 dstat

    原文链接:http://www.bkjia.com/Linuxjc/935113.html 参考链接:https://linux.cn/article-3215-1.html,http://lhfli ...

  7. ELK 之一:ElasticSearch 基础和集群搭建

    一:需求及基础: 场景: 1.开发人员不能登录线上服务器查看详细日志 2.各个系统都有日志,日志数据分散难以查找 3.日志数据量大,查询速度慢,或者数据不够实时 4.一个调用会涉及到多个系统,难以在这 ...

  8. PowerManager.WakeLock

    PowerManager.WakeLock PowerManager.WakerLock是我分析Standup Timer源代码时发现的一个小知识点,Standup Timer 用WakeLock保证 ...

  9. Oracle单表的简单查询

    Oracle单表的简单查询 查看表结构 desc emp; 查询所有列 Select * from emp; 查找所以部门编号(查指定的列) select deptnofrom emp; 查找编号不同 ...

  10. 【Cocos2d-x游戏引擎开发笔记(25)】XML解析

    原创文章,转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/9128819 XML是一种非常重要的文件格式,由于C++对XML的支持非常完善 ...