附件 2:
实验题目 模型导入与脚本练习
一、【实验名称】
模型导入与脚本练习
二、【实验目的】
掌握使用三维建模软件进行三维模型的优化与导出,及在 Unity3D 中模型导
入方法与设置;掌握 Javascript 脚本在 Unity3D 中的基本应用。
三、【实验原理】
三维模型的优化方法和技巧,模型的导出与导入,Javascript 脚本的基本语
法及使用技巧。
四、【具体操作内容及要求】
1.创建工程机工程文件,在 Unity3D 中导入资源及模型,如下图所示:
2. 熟悉 Javascript 脚本语法,并实现对场景中对象的交互控制,具体要求:
(1)实现第一人称控制,手榴弹的投掷效果。
点击 GameObject->CreateEmpty,创建空对象,命名为 GameObject2,定义
该对象的位置为第一人称的手臂位置,在 script 文件夹中创建 javascript 文件,
命名为 grenadescript,并在该文件中添加如下代码:
var grenadePerfab:GameObject;//手榴弹
var grenadespeed=50;
private var nextFire = 0.0;
//手榴弹销毁
var lifttime = 2;
var creationTime = Time.time;
unction Update () {
if(Input.GetButtonDown("Fire2")||Input.GetKeyDown(KeyCode.C))
{
var
cloneGrenade
:GameObject=
Instantiate(grenadePerfab,this.transform.position,transform.rotation);
var
focre:Vector3
=
pos.transform.position-cloneGrenade.transform.position;
cloneGrenade.rigidbody.AddForceAtPosition(focre,pos.transform.position,F
orceMode.Impulse);//设置目标力
}
var grenade:GameObject = GameObject.FindWithTag("grenade");
if(grenade && (Time.time >(creationTime+lifttime)))
{
lifttime=Time.time+1;
Destroy(grenade);
}
}
把代码拖拽给第一人称,把 GameObject2 拖拽进第一人称里,并把 prefab
文件夹中的 grenade1 模型拖拽给变量 Grenade Perfab 和为手榴弹模型添加
“grenade”标签,把 GrameObject2 拖拽给变量 Pos,如下图所示:
(2)在地形中添加墙和门的元素,布置完整的行走场景,效果如下图所
示:
(3)实现门的动画及脚本控制
Ctrl+6 打开动画的编辑面板,把动画保存在 animation 文件夹中,然后右键
门的 x 坐标,点击 Addkey,设置门的开始与结束的位置(如下图),在 door1
的 Inspector 面板把 playAutomatically 选项的勾去掉,并给门添加 door1 的标签,
然后在 grenadescript.java 文件中添加如下代码:
function OnControllerColliderHit(hit:ControllerColliderHit)
{
if(hit.gameObject.name == "door1")//门的碰撞检测
{
hit.gameObject.animation.Play("opendoor1");
}
}
(4)碰撞盒的添加及碰撞检测的应用。
给 box 盒子添加 box 标签,并在 OnControllerColliderHit 函数中添加如下
代码:
if(hit.gameObject.tag == "grenadebox")//盒子的碰撞检测
{
}
Destroy(hit.gameObject);
(5)Trigger 触发器的应用
创建一个 cube,命名为 forwardbox,并给该模型添加 forwardbox 标签,调整
位置(如下图),在 inspector 面板把 BoxCollider 里的 Is Trigger 选项的勾勾上,
把 MeshRenderer 的勾去掉,在 grenadescript,java 文件中添加如下函数:
function OnTriggerEnter (other : Collider)
{
if(other.gameObject.name == "forwardbox")
{
var animObj:GameObject = GameObject.FindWithTag("door1");
animObj.gameObject.animation.Play("opendoor1");
}
}