Unity 角色控制相关操作

来源:互联网 发布:创维32e380s安装软件 编辑:程序博客网 时间:2024/05/13 06:12

首先打开unity游戏引擎编辑器,然后在Project视图中右键选择Import Package -> Charactr Controller(角色控制器)把它导入我们的工程中。如下图所示,第一人称与第三人称的组建已经加入Project视图中。3rd Person Controller 表示第三人称控制器,First Person Controller表示第一人称控制器。

下面我们在看看第三人称视角,如下图所示,在Project视图中将3rd Person Controller拖拽入Hierarchy视图中。第三人称视角需要使用我们原有的摄像机,如果刚刚将摄像机的删掉的话。在Hierarchy视图中点击Creat->Camera 即可。然后选择摄像机,在右侧Inspector视图中设置它的tag为MainCamera,如下图所示。最后在Hierarchy视图中选择3rd Person Controller,在右侧Inspector视图中将Third Person Camera 脚本的 Camera Transform 变量绑定上刚刚创建的主摄像机,此时运行游戏后以第三人称视角移动主角行走与跳跃,摄像机永远都会在跟随在后面除非修改角色控制器组件中默认提供的源码,源码都在右侧监测面板视图中直接点开就可以查看。

下面我们学习角色控制器组件在其它模型之间的应用。首先在Hierarchy视图中创建两个Cube(立方体对象) 命名为:Cube0(发出碰撞的对象)Cube1(接收碰撞的对象),然后在Hierarchy视图中选择Cube0对象,接着Unity导航菜单栏中选择Component(组件)-Character->FPS Input Controller。 补充一句,角色控制器组件一定要在Project视图中导入,否则这里将无法绑定组件。角色控制器组件因为与碰撞组件相互冲突,所以添加角色控制器组建后Collider组件就会消失。下面我们实现一段简单得代码,使用添加过角色控制器组件的Cube0 去碰撞未添加角色控制器组件的Cube1。
using UnityEngine;
using System.Collections;

public class Main : MonoBehaviour
{

string castName = null;

string receiveName = null;

void OnGUI()
{
GUI.color = Color.black;
GUI.Label(new Rect(100,100,200,30),"CastObjectName : " + castName);
GUI.Label(new Rect(100,200,200,30),"ReceiveObjectName : " + receiveName);

}

void OnControllerColliderHit(ControllerColliderHit hit)
{
GameObject hitObject = hit.gameObject;

if(!hitObject.name.Equals("Terrain"))
{
castName = gameObject.name;
receiveName = hitObject.name;

}

}

// Use this for initialization
void Start ()
{

}

// Update is called once per frame
void Update () {

}
}

下面我们给Cube1对象绑定刚体组件,选择Cube1对象然后在导航菜单栏中选择Component->physics ->Rigidbody(刚体)。我们看看下面这段代码,使用添加了角色控制器组件的Cube0 去碰撞添加刚体组件的Cube1,当他生碰撞时计算一下Cube0碰撞Cube1时的碰撞角度向量,然后通过刚体向他施加一个力把它推开。

using UnityEngine;
using System.Collections;

public class Main : MonoBehaviour
{

string castName = null;

string receiveName = null;

void OnGUI()
{
GUI.color = Color.black;
GUI.Label(new Rect(100,100,200,30),"CastObjectName : " + castName);
GUI.Label(new Rect(100,200,200,30),"ReceiveObjectName : " + receiveName);

}

void OnControllerColliderHit(ControllerColliderHit hit)
{
GameObject hitObject = hit.gameObject;
Rigidbody rigidbody = hitObject.rigidbody;
if(rigidbody != null && !rigidbody.isKinematic)
{

if(!hitObject.name.Equals("Terrain"))
{
rigidbody.AddForce(new Vector3(hit.moveDirection.x,0,hit.moveDirection.y) * 10);
castName = gameObject.name;
receiveName = hitObject.name;

}
}
}

// Use this for initialization
void Start ()
{

}

// Update is called once per frame
void Update () {

}
}