Unity3D 学习游戏开发心得

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一周所学总结

对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,碰撞器不需要。

狗刨学习网,学的更多、免费资源、免费视频下载

相关推荐