Unity3D 学习游戏开发心得
罗佳 10120340238
小组排名:黄馨然,罗佳
在这将近20天的游戏开发中,第一次一边学习,一边开发游戏,虽然最后做出来的游戏有点差强人意,但是在这整个过程中学到的东西让自己觉得这20天的努力让这一整个学期学到的知识一下子充盈好看了起来。 首次开发自己的游戏,是一个较艰难的过程,有时候在一个问题上耗上五六个小时仍无半点进展,那感觉确实让人十分沮丧,同样的,耗上五六个小时解决一个问题时的喜悦之感也是无与伦比的。在这20天的开发过程中,个人感觉比较难的,就是摄像机的处理了, 总是无法使场景中的游戏对象,显示在合理的位置,调整摄像机的位置以及角度都非常费时间。
一下是对自己在游戏开发过程中所领悟到的新知识做一个总结:
关于摄影机控制,如果场景中有多架摄影机,那么如何确定第一打开时间所显示的摄影机,就需要设置Camera属性中的Depth数值,数值越大的摄影机越优先显示。 关于材质数量的控制,如果一个物体给与一个材质球,那么Unity3D对于材质数量和贴图数量没有任何的限制。如果一个物体给与多个材质球,我们需要用Multi/SubObject来实现,但是这种罗列的材质球的数量没有严格的控制,但尽量保持在10以内,过多的数量会导致一些错误。如果不使用Multi/SubObject材质球,也可以选择一些面,然后给与一个材质球。这样系统会自动将其转换成Multi/SubObject材质。综合而言Unity3D软件对于材质的兼容还是很好的。
关于物体的质感,“Diffuse”,“Diffuse Bumped”,“Bumped Specular” 这三种类型为常用类型,其中Bumped需要增加Normal法线贴图来实现凹凸。 ? Decal
这种材质为贴花材质,即相当于Mask类型,可以再Decal(RGBA)贴与一个带有Alpha通道的图像,形成和原图像相叠加的效果。
? Diffuse Detail
这种材质可以创造出污迹和划痕的效果,即相当于Blend混合材质。
? Reflective
其中各种类型可以创造出金属反射效果,需要增加Cubmap贴图。
? Transparent
其中各种类型可以创造出透明的效果,需要增加具有Alpha的通道贴图。
注意:如果要做玻璃贴图,Alpha如果全是灰色或黑色(即要求全透明),那么Alpha就会失效,如果要全透明,材质Alpha其中必须至少有1像素为白色。
? Nature
其中SoftOcclusion Leaves类型主要应用于片状的树叶材质。
关于物体的尺寸,默认情况下U3D系统单位1等于1米,等于软件1单位。如果我们制作是按照实际大小比例制作,那么导入U3D引擎会自动变成原来的1%的大小。因为默认情况下,U3D的FBXImporter中的Scale Factor的数值为0.01。那个我们可以将ScaleFactor的数值恢复为1,但是这样会占用模型资源,比较消耗物理缓存。我们也可以将这个物体从Hierarchy中选择,并使用Scale放大100倍,这种设置可以有很多好处,并且还能通过用脚本制作动画。
关于代码开发:
1. 定义一个游戏对象为另外一个游戏对象的子对象.
public class player : MonoBehaviour
{public GameObject ProjectilePrefab;}
2. 平移游戏对象
//Horizontal 水平, Vertical 垂直
float amtToMove = Input.GetAxis("Horizontal")*Time.deltaTime*Speed;
gameObject.transform.Translate(Vector3.right*amtToMove);
amtToMove = Input.GetAxis("Vertical")*Time.deltaTime*Speed;
gameObject.transform.Translate(Vector3.forward*amtToMove);
3. 定位游戏对象
transform.position = new Vector3( -743.07f, transform.position.y, transform.position.z);
4. 获取游戏对象的位置
Vector3 position1= new Vector3( transform.position.x,
transform.position.y + transform.localScale.y/2.0f,
transform.position.z);
5. 判断某个按键是否被按下
if(Input.GetKeyDown("space"))
{
//执行事件
Instantiate( ProjectilePrefab , position1, Quaternion.identity);
// 在指定的位置position1,实例化一个游戏对象ProjectilePrefab
}
6. 因碰撞而引起的事件,执行事件行为
void OnTriggerEnter( Collider ontherObject )
{
if(ontherObject.tag == "enemy")
{
// Destroy( this.gameObject);
if(player.lives>0)
{
player.lives--;
}
else
{
Application.LoadLevel("FailSence");
}
Enemy enemy = (Enemy) ontherObject.gameObject.GetComponent("Enemy");
// Instantiate (BustPrefab, enemy.transform.position, enemy.transform.rotation);
StartCoroutine(DestroyPlayer());
enemy.SetRedBallPosition();
}
}
9. 加载游戏关卡, 即 切换游戏场景Sence
Application.LoadLevel("GameSence");
10. 实现多线程操作
//OnTriggerEnter是 两个物体碰撞响应函数,
其中一个游戏对象设置为刚体Rigibody, Is Kinematic,
另外一个游戏对象设置为 Is Trigger
void OnTriggerEnter( Collider ontherObject )
{
StartCoroutine(Display()); //协同程序 即多线程
}
IEnumerator Display()
{
Instantiate (BustPrefab, transform.position, transform.rotation); //多线程完成的任务,实现爆炸效果
gameObject.renderer.enabled = false ; //隐藏游戏对象
yield return new WaitForSeconds(2.0f); // 延时函数
gameObject.renderer.enabled = true; // 显示游戏对象
}
11. 销毁游戏对象
Destroy(this.gameObject);
12. 在一个游戏对象里获取另外一个游戏对象
Enemy enemy = (Enemy) ontherObject.gameObject.GetComponent("Enemy"); //Enemy为某个游戏对象的类名(脚本)
通过 类对象实现调用 函数
enemy.SetRedBallPosition();
对Unity3D一周所学的总结
一、Transform
游戏对象的Transform属性可以进行位置、旋转、大小的设置。
属性:
1、 transform.position在世界空间坐标transform的位置
如:transform.position = Vector3(0, 0,100); //移动物体到(0, 0, 100)
2、 transform.rotaition//旋转
如:transform.rotation = Quaternion.identity; //重设世界的旋转角度
3、 transform.scale//缩放
如:transform.localScale += Vector3(0.1,0,0); //扩大物体的x轴向0.1个单位 transform.localScale -= Vector3 (0.5, 0, 0);
方法:
1、位移:transform.Translate
如:transform.Translate (Vector3.forward);//对象向前位移
transform.Translate (new Vector3(10,0,0));//对象向x轴方向位移
2、旋转:transform.Rotate
如:transform.Rotate (new Vector3(0,10,0));对象绕y轴旋转
3、围绕旋转:transform.RotateAround
如: transform.RotateAround (Vector3.zero, Vector3.up, 20 * Time.deltaTime); //围绕世界坐标原点,每秒20度物体自旋
查找:
Transform.Find //通过名字查找子物体并返回它
如: //查找到a物体并旋转它
function Update()
{
a = transform.Find("a/b/c/d");
a.Rotate(Time.deltaTime*20, 0, 0);
}
二、Input
想要读取轴向使用Input.GetAxis方法获取下列默认轴: "Horizontal" 和"Vertical" 映射于控制杆、A、W、S、D和箭头键(方向键)。 "Mouse X" 和"Mouse
Y" 映射于鼠标,"Fire1", "Fire2" "Fire3"映射于键盘的Ctrl、Alt、Cmd键和鼠标中键或控制器的按钮。新的输入设置可以使用输入管理器来添加。
如:
if(Input.GetKey(KeyCode.E)){}//当按下键盘上的E键时发生
if(Input.GetMouseButton(0)){}//当点击鼠标左键,0、1、2表示鼠标左键右键中键 if(Input.GetButton("Fire1")){}//当点击鼠标时发生
float x = Input.GetAxis ("Horizontal");//水平
float z = Input.GetAxis ("Vertical");//垂直
//transform.Translate (x*speed*Time.deltaTime,0,z*speed*Time.deltaTime);//控制对象的前后左右的位移
三、GameObject对象
GameObject是Unity场景里面所有实体的基类.
游戏对象的创建
如:GameObject cube=GameObject.CreatePrimitive (PrimitiveType.Cube);//创建一个cube对象
克隆对象:
如:GameObject.Instantiate (cube);//克隆一个cube对象
GameObject.Instantiate (cube, cube.transform.position, Quaternion.identity); //克隆一个cube对象,获取它的位置,不旋转
销毁对象:
如:GameObject.Destroy (cube);//销毁一个cube对象
GameObject.Destroy (cube, 2f);//两秒之后cube对象销毁
对象的查找:
GameObject go=GameObject.Find ("Cube");//通过对象名称Cube查找
GameObject go2=GameObject.FindWithTag ("cube");//通对象的标签cube查找 GameObject go3=GameObject.FindGameObjectWithTag ("cube");//通对象的标签cube查找
获取对象脚本:
如:Player player=sphere.GetComponent<Player>();//获取脚本Player
print (player.myRocket);//获取脚本中公共的对象myRochet
Time:
属性:Time.deltaTime //计时
如:float a=3.0f;
void Update () {//三秒倒计时
a-=Time.delatTime;
print(a);
}
Random
int b=Random.Range(0,100) 包括最大和最小
float c=Random.Range(0.0f,1.0f); 包括最小但不包括最大
协程(Coroutine)
开启协程的两种方式:
StartCoroutine ("Do");
StartCoroutine (Do());
如:
void Start () {
print("Start开始");
StartCoroutine("Do");
print("Do调用后");
}
IEnumerator Do(){
print("Do开始");
yield return new WaitForSeconds(3.0f);
print("暂停3秒后");
}
消息传递
同级别对象之间
transform.SendMessage ("Get");
transform.SendMessage ("Get","aaaaaaaaaa");
子对象向父对象发送
transform.SendMessageUpwards("Get");
transform.SendMessageUpwards("Get","aaaaaaaaaa");
父对象向子对象发送
transform.BroadcastMessage("Get");
transform.BroadcastMessage("Get","aaaaaaaaaa");
碰撞检测:碰撞器(Collision) 触发器(Trigger)
碰撞器(Collision)
OnCollisionEnter(Collision col){}//进入
OnCollisionStay(Collision col){}//逗留
OnCollisionExit(Collision col){}//退出
触发器(Trigger)
OnTriggerEnter(Collider col){}//进入
OnTriggerStay(Collider col){}//逗留
OnTriggerExit(Collider col){}//退出
区别:是否勾选IsTrigger,触发器必须勾选上Is Trigger,碰撞器不需要。
狗刨学习网,学的更多、免费资源、免费视频下载
InDesign版式设计的教学心得导读既是InDesign优势所在第一阶段教学方法上主要利用案例教学法讨论教学法等通过大量的内页临…
InDesignCS4学习技巧总结快捷基础教程问我在排版过程中经常要用到一些相同的字体字号度量单位笔画粗细等每次都要做一些重复的操…
浅谈Indesign排版设计教学的体会摘要InDesign课程是中职学校平面设计专业的必修课程在排版设计领域它以其非凡的表现被广泛…
没接触过indesign速学教程以一本书的排版为例首先打开indesing文件新建文档ctrln新建文档的设置用途打印页数100页…
AdobeInDesign常見問題總結在一个系统内同时安装InDesign20及InDesignCS会不会产生冲突在按照正确安装方…
1.引言.............................................................…
第二节窗口内文本的输入输出函数1、窗口内文本的输出函数intcprintf(格式化字符串,变量表);intcputs(char*s…
队伍组成·开发团队·制作人·执行制作人·策划团队·程序团队·美术团队·测试团队我理解的咱们这个系统主要是这3块人的沟通游戏策划团队…
Unity3D游戏开发之做iPhone游戏之代码优化个人总结1.尽量避免每帧处理比如:1.functionUpdate(){DoS…
Android游戏开发设计步骤总结——杰瑞教育阅读材料(一)1手机游戏开发简介游戏的本质就是在屏幕上不断地显示和更新图片,只不过不…