搜档网
当前位置:搜档网 › Unity3D游戏开发笔记2

Unity3D游戏开发笔记2

Unity3D游戏开发笔记2
Unity3D游戏开发笔记2

2013.1.19

3.【第一张地图与跳跃的改善】

继续吧,为了方便继续编写的敌人之类的脚本,所以打算今天先把第一张地图画个大概。结果,画了我好久的地图.....≡(▔﹏▔)≡

我对美术方面的天赋简直是惨不忍睹了.....加之地图中途画的差不多的时候Unity又崩溃了一次....忘了保存(ㄒoㄒ)。于是又忙活半天....这个地图完全靠临时发挥了,第一张地图我画了好几次了,基本上每次画出来的地形之类的都完全不一样,所以就不多解释了,就上一张大概的场景图吧:

看起来好简单吧?唉......开启编辑器,这时侯如果在场景中转悠的话,很轻易就可以发现人物跳跃的功能有些瑕疵,就是跳动速度太快,相机都晃的花眼.....

事实证明,偷懒是行不通的......那么现在还是打开PlayerControl脚本改造一下吧。

在脚本的Move函数中,原本的跳跃功能只有短短两行,就是判断人物是否位于地面,在的话,就把人物向上抬升一段距离,结果造成跳跃过于突兀的效果。

现在的话,可以先把判断角色是否位于地面的那段if语句注释掉,删掉也可以。

为了使跳跃起来不那么突兀,我的想法是定义一个bool变量,当角色在地面上按下空格键时,变量为true,否则当角色跳起来超过一定高度就为false,判断高度的方式,我想来想去,用了射线检测的方式(当然,没用的错误的实验肯定不会写出来的)。

首先在最开始Start函数上面定义一个bool变量:

#region 判断

private bool m_jumpTmp=true;//判断是否可以跳跃

#endregion

然后在玩家按下空格后,定义一个临时的变量存放角色向下的方向,再判断角色是否位于地面,如果在地面,就可以挑。否则跳跃超过1.5米后,就得等落地了才能跳了:

if(Input.GetKey(KeyCode.Space))

{

Vector3 m_direction=m_transform.TransformDirection(Vector3.down);//方向向下的临时变量

if(m_controller.isGrounded)

{

m_jumpTmp=true;

}else if(!Physics.Raycast(m_transform.position,m_direction,1.5f))//判断跳跃高度

{

m_jumpTmp=false;

}

if(m_jumpTmp)

{

m_animation.CrossFade("Jump2");

m_transform.Translate(Vector3.up*m_jump*Time.deltaTime);

}

}

之所以把东西写在按空格键里面,是因为节省些许性能。把代码如此改了之后,再回到游戏中运行试一下,跳跃果然要缓多了。

2014.1.20

4.【敌人的AI(一)】

今天就先来写敌人的AI吧。

首先导入一群怪物的模型包,然后在根目录下新建一个文件夹,名为_Enemy,然后将导入的怪物模型移动进去,以方便后来分辨。

然后在_Script中新建一个文件夹,名为Enemy,然后在Enemy文件夹中新建一个脚本,名为Enemy。因为考虑到敌人肯定不止一个,所以每个敌人都采用单独的脚本肯定不现实(这也使我当初重写了四五遍敌人脚本后才恍悟到的.....),我就想到是否可以直接先写一个敌人的主要脚本,往后每个敌人的脚本都从中

继承,每个敌人到时只需要改一点就可以了●ω●。

在脚本最开始,首先定义敌人的属性及自身的对象:

#region 属性

public string m_name;//名字

public int m_level;//等级,以判断角色应当获取的经验

public int m_maxLife;//生命

public int m_currentLife;//当前生命

public int m_defense;//防御力

public int m_attack;//攻击力

public float m_speed;//速度

public int m_rotateSpeed;//旋转速度

public float m_attackRadius;//攻击半径

#endregion

#region 对象

public Transform m_transform;//自己

#endregion

在这里,对敌人就不设置魔法值了,其它属性跟角色的差不多罢。

因为在游戏中我还设置了Boss,因此还必须定义一个判断敌人是否是Boss的bool变量,默认为false:#region 判断

public bool m_isBoss=false;

#endregion

然后在Start函数中取得自身对象:m_transform=this.transform;//获取自己对象

因为现在这个敌人脚本只是一个基类,因此还必须要求从其继承的那些敌人能够为自己的属性进行赋值,所以我又定义了一个SetAttribute的虚函数函数,类型为保护,这样在子类中就可以用这个类进行敌人各项属性的赋值:

protected void SetAttribute(string name,level,int Life,int defense,int attack,int speed,int rotatteSpeed,float attackRadius)

{

m_name=name;

m_level=level;

m_maxLife=Life;

m_currentLife=Life;

m_defense=defense;

m_attack=attack;

m_speed=speed;

m_rotateSpeed=rotatteSpeed;

m_attackRadius=attackRadius;

}

为了不在子类中更改Start函数,另外还要再声明一个Init的虚函数,里面什么都不写,并在Start函数最开始进行调用:

void Start ()

{

Init();

m_transform=this.transform;//获取自己对象

}

protected virtual void Init()

{

}

这样的话,子类初始化什么东西的话,就可以直接在这个函数中搞定了。

然后,敌人的状态肯定要分为没有目标时,干什么,有目标时就攻击目标之类的动作,所以,应该再定义一个bool类型的变量,进行这点的判断吧。这个类型就定义在“判断”那一堆:

#region 判断

public bool m_isBoss=false;

protected bool m_isIdle=true;

#endregion

这时就可以在Update函数中进行判断了:

if(m_isIdle)//如果处于空闲状态

{

}

else

{

}

这时候,我选择在最开始加上一堆放“变量”的,并在那儿定义一个随机值m_idleStat用来作为随机播放动画的随机值,m_idleTime用来限制每一个动画播放的时长:

#region 变量

protected int m_idleStat;//定义空闲状态动画的随机值

protected float m_idleTime=0;//每一个空闲状态持续时间

#endregin

现在就可以在Update函数中加上这些:

if(m_isIdle)

{

m_idleTime-=Time.deltaTime;

if(m_idleTime<0)//空闲随机时间到了就随机做出新动作

{

m_idleStat=Random.Range(0,11);

audio.clip=m_sound;

audio.Play();

m_idleTime=3;

}

}

其中的随机值用来随机出0~10几个数字,用来判断随机播放什么动画。并且,在播放动画的同时,叫一声。声音变量定义在前面“变量”标签中,现在既然涉及到声音,那就把攻击声音和技能声音一块儿定义了:

//声音

public AudioClip m_sound;

public AudioClip m_attackSound;

public AudioClip m_skillSound;

既然涉及到了动画,那就要获取动画组件了。

在脚本Start函数上面的“对象”标签中,再定义一个动画组件:

protected Animation m_animation;//动画组件

并在Start函数中进行初始化:

m_animation=GetComponent();

这时候再定义一个“动画”标签,将敌人的各个动画分别赋值给定义的string类型,这样会更加好控制:

#region 动画状态

protected string m_animationIdle="idle1";

protected string m_animationIdle2="idle2";

protected string m_animationIdle3="idle3";

protected string m_animationWalk="walk";

protected string m_animationAttack="attack";

protected string m_animationSkill="skill";

protected string m_animationDeath="death";

#endregion

这些动画,到时候需要在Inspector中对敌人的动画进行改名,这时先就定义好吧。

动画之类的都定义好了,在Update函数中就可以进行随机动画的判断了。这里我使用的Swicth,以前本来也不是使用switch进行判断的,现在写的时候觉得switch可能比较简单些,就改了结果好像还复杂些了●﹏●.....不过没办法,折腾了半天,都差不多弄好了,就不改了:

switch(m_idleStat)

{

case 1:m_animation.CrossFade(m_animationIdle);

audio.clip=m_sound;

audio.Play();

break;

case 2:m_animation.CrossFade(m_animationIdle);

m_transform.Rotate(0,m_rotateSpeed*Time.deltaTime,0);

break;

case 3:m_animation.CrossFade(m_animationIdle2);

break;

case 4:m_animation.CrossFade(m_animationIdle2);

break;

case 5:m_animation.CrossFade(m_animationWalk);

m_transform.Rotate(0,m_rotateSpeed*Time.deltaTime,0);

break;

case 6:m_animation.CrossFade(m_animationWalk);

m_transform.Rotate(0,m_rotateSpeed*Time.deltaTime,0);

break;

case 7:m_animation.CrossFade(m_animationWalk);

m_transform.Rotate(0,m_rotateSpeed*Time.deltaTime,0);

break;

case 8:m_animation.CrossFade(m_animationWalk);

m_transform.Translate(Vector3.forward*m_speed*Time.deltaTime);

break;

default:m_animation.CrossFade(m_animationIdle3);

m_transform.Translate(Vector3.forward*m_speed*Time.deltaTime);

break;

}

原理就是使用switch判断每个随机数字,在某些数字上就旋转或者前进,或者嫌在原地。东西看起一大堆,实际上原理很简单......

然后在状态最后向自己前面发出一条射线,判断自己前方有没有人,有的话,就将状态m_isIdle置为false: m_forward=m_transform.TransformDirection(Vector3.forward);

if(Physics.Raycast(m_transform.position,m_forward,out

m_hit,m_attackDistance,m_layerMask))

{

m_attackTarget=m_hit.collider.gameObject.transform;//如果看见任何人类对象,就获取其位置,并将Idle状态置为false

m_isIdle=false;

}

其中的m_forward是向前的一个Vector3变量,定义在前面“变量”标签中:

protected Vector3 m_forward;//敌人的前方向

hit是属于RaycastHit变量,所以也要在前面定义:protected RaycastHit m_hit;//射线碰撞

m_attackDistance是定义的敌人视线距离(还是那句话,我数学不好+▂+,就不用那些复杂的模拟现实去判断怪物的视角高度之类的了,直接一条有距离的射线从敌人面前射出去,撞上了就代表“看见了”.....),也要定义在最前面“变量”标签中:protected float m_attackDistance=8;//会攻击的视线距离

至于m_layerMask则是层蒙版,今天在这个上面又折腾了好久......我在编辑器的层标签里面新建了一个标签,命名为:“Human”,并把它指派给了玩家,然后再在最开始变量标签中定义了一个层protected LayerMask m_layerMas;

在Start函数中进行初始化:m_layerMask=1<

最后m_attackTarget就是属于“看见”的目标对象了,看见了谁,就把谁赋给它,然后对这个对象进行攻击等等,也先定义在开始的“对象”标签中:

public Transform m_attackTarget;//攻击对象

获取到了看见的对象后,就可以把m_isIdle这个空闲状态设置为false了,代表不再闲着没事儿,而是应该进行攻击了。接下来就在Update函数中的if(m_isIdle)判断后面加上一个else语句,里面放上RotateTo();

Attack();

两个函数。这两个函数写在外边,也是同样考虑到以后有的敌人可能会改变攻击方式的。

首先是Rotate函数,定义在Update函数下边吧:

protected void RotateT o()

{

Vector3 m_oldAngle=m_transform.eulerAngles;//当前旋转角度

m_transform.LookAt(m_attackTarget.position);//盯着攻击对象

float m_target=m_transform.eulerAngles.y;//目标角度吧

float

m_targetAngle=Mathf.MoveTowardsAngle(m_oldAngle.y,m_target,m_rotateSpeed*Time.deltaTi me);//计算应转动的角度

m_transform.eulerAngles=new Vector3(0,m_targetAngle,0);//转动角度}

作用就是改变敌人的当前面向的角度到面向攻击对象的方向,说实话,这一段我也不是很明白,只是知道大概达到了转向的效果。

在Rotate函数下继续定义Attack攻击函数,在函数中用到的变量m_distanceT oOther是敌人当前与攻击目标的距离,定义在前面的“变量”标签中:

protected float m_distanceT oOther;//与攻击对象的距离

出此之外还有攻击的粒子效果,粒子效果放在“对象”标签中,这里我就先把两个粒子效果都定义起来了:

public Transform m_attackParticle;//普通攻击粒子效果

public Transform m_skillParticle;//技能攻击粒子效果

这个粒子效果只是用来判断攻击对象的,真正的伤害计算我准备放到粒子效果里面,那样的话,大概能做到无论是NPC还是敌人都能进行攻击罢?(为自由的游戏而奋斗~~)。

攻击函数:

protected void Attack()

{

m_distanceToOther=Vector3.Distance(m_transform.position,m_attackTarget.position);

if(m_distanceToOther

{

m_forward=m_transform.TransformDirection(Vector3.forward);

if(Physics.Raycast(m_transform.position,m_forward,out

m_hit,m_attackRadius,m_layerMask))

{

m_animation.CrossFade(m_animationAttack);

Instantiate(m_attackTransform,m_hit.collider.gameObject.transform.position,Quaternion.ide ntity);//攻击,实例化一个粒子

}

}else if(m_distanceToOther<20)//如果距离小于20,对目标进行追击

{

m_animation.CrossFade(m_animationWalk);

m_transform.Translate(Vector3.forward*m_speed*Time.deltaTime);

}else if(m_distanceToOther<90)// 如果距离大于20,就回到Idle状态,不追目标了

{

m_isIdle=true;

}else//超过九十米的话,为了省点资源,就把这个敌人销毁罢

{

Destroy(this.gameObject);

}

}

这个攻击函数会先对自己与攻击对象的距离进行判断,若果两者之间的距离小于自身的攻击半径,就向前发射一条射线,若果碰撞到了任何人类层的目标,就进行攻击(实例化一个普通攻击的粒子效果)。否则两则距离小于20米的话,就项目标跑过去,当然,距离大于90米的话(出了玩家的视线范围),就直接销毁自身。

好了,天色不早了,接下来的明天继续吧。

2014.1.21

5.【敌人AI(二)与....攻击判定】

昨天的脚本现在其实已经可以运行进行测试了。

那么就先测试一下。首先找到_Enemy文件夹中导入的怪物模型,这里我以wolf,也就是狼为例,它也将作为玩家最先见到的敌人。将狼的模型拖入场景中,然后在Inspector面板中将小狼模型所需要用到的动画按照先前脚本中定义的名字改名,这里主要是为了方便,因为默认状态动画有了,就不用在继承“敌人”脚本的子类中去赋值动画名称了,相比在脚本中赋值动画名来说,在Inspector中改动画的名字显得轻松多勒!

如图:

只需要将需要用到的动画改名就可以了。

然后就是脚本了。

在_Script文件夹下的Enemy文件夹下新建一个脚本,名为“EnemyWolf”,双击打开脚本。

在最开始那儿就不能让其继承自Monobehavaour,而要改为Enemy。然后覆盖先前啥都没写的Init函

数,他将实现小狼属性的初始化:

public class EnemyWolf : Enemy {

protected override void Init()

{

SetAttribute("小狼",2,100,20,20,2,60,2.5f);

}

}

好了!这个脚本就算完成了!

什么?!就这点?

木错,以后的敌人跟这个相差应该也不是很大,就是这样。然后将一个狗叫的音效拖到脚本的m_sound 上(浪叫不好找啊,就用狗叫来代替咯.....~~),并将音效赋给小狼的AudioSource组件,去掉勾选默认播放。

现在可以将脚本拖到场景里的小狼身上了,运行游戏,小狼开始在原地转悠起来,过一会儿叫一声.....并且看见玩家的角色后,还会跑过来一直跟着。(本来是有问题的,调试了良久之后,放在这儿的脚本当然没有问题了......),现在初步的AI就完成了。

额......又调试了一下,发现还是有个小问题,就是敌人经常看不见玩家的角色似的?直接无视?又仔细调试了几遍,发现了原因所在,这个原因挺重要的,就在这儿提一下: 默认这些对象的position一般都是物体的最底部,也就是人的脚下之类的地方,直接发射射线的话,从地面射出的射线恐怕也只有射中别人的脚.......( ╯□╰),所以发射射线时,应该让坐标向上抬起一段距离,所以应该改一改Enemy的脚本,把脚本中两处发射射线的地方,第一个起始位置加上一个Vector3.up:

if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,out

m_hit,m_attackRadius,m_layerMask))

{

。。。。。。

}

现在就没问题了,当角色进入攻击半径时,它甚至会进行攻击。只是因为现在还没有将攻击的粒子赋给它,所以控制台会打印一个错误。

刚才用手机去了一趟官网,被打击勒......

那么导入粒子资源包,创建一个_Particle文件夹存放,然后拖放一个粒子效果到小狼脚本上去,同时将小狼攻击音效拖放到其身上,再次运行游戏,便可以看见攻击效果了。考虑到以后工程项目中都会存在这些资源,所以以后我都不会再提起导入资源包的事儿了。

虽然是这些行为看似没问题了,不过小狼的攻击明显过快,这里就还的设置一个攻击间隔,定义在最开始的“变量”标签中:protected float m_attackDelay=2;//攻击延时

然后再Attack函数中进行攻击间隔的判断,只有当攻击间隔时间到了,小狼才会再次攻击:m_attackDelay-=Time.deltaTime;

if(m_distanceToOther

{

if(m_attackDelay<0)

{

m_forward=m_transform.TransformDirection(Vector3.forward);

if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,out

m_hit,m_attackRadius,m_layerMask))

{

m_animation.CrossFade(m_animationAttack);

Instantiate(m_attackParticle,m_hit.collider.gameObject.transform.position+Vector3.up,Quat ernion.identity);//攻击,实例化一个粒子

m_attackDelay=2;//攻击成功,重置延时

}

}

}

同时我在实例化攻击粒子时加了一个Vector3.up向量,令粒子产生在玩家的身体中间,这样看起来好看些。如此,攻击也还算正常了。

敌人的技能应该属于随机发出来的,所以还要定义一个随机数,通过随机出敌人何时发出技能,随机数依然定义在最开始的“变量”标签中:protected float m_skillRandom;//随机出现技能

然后在修改一下上面的攻击射线碰撞:

if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,out

m_hit,m_attackRadius,m_layerMask))

{

m_skillRandom=Random.value;

if(m_skillRandom<0.96f)//大概有4%的几率发出技能

{

m_animation.CrossFade(m_animationAttack);

Instantiate(m_attackParticle,m_hit.collider.gameObject.transform.position+Vector3.up,Quat ernion.identity);//攻击,实例化一个粒子

}else

{

m_animation.CrossFade(m_animationSkill);

Instantiate(m_skillParticle,m_hit.collider.gameObject.transform.position+Vector3.up,Quater nion.identity);//攻击,实例化一个技能粒子

}

m_attackDelay=2;

}

如此,敌人就会有普通攻击,也有一定几率发出技能。

敌人的攻击判定有点恼火!

本来我的想法是使用攻击粒子进行碰撞检测,再根据粒子碰撞的对象进行伤害判定的,结果搞了半天才发现行不通!

因为在碰撞检测的两个物体之间,貌似需要移动才能顺利进行检测.....脚本写完了,本来高高兴兴的,然后突然发现,如果角色不动的话,就完全拿它没办法了.....绞尽脑汁也没想出什么好点的可行解决办法。然后....然后我更不可能去根据距离判定伤害了......毕竟,我想要实现的是“所有生物皆可攻击”的.....

不过,解决办法还是没想出来,倒是想出了个折衷之道:那就是利用攻击时实例化攻击粒子效果那会儿,再次投射出一条射线,这条射线打谁都行,于是,就采用了。

接上面,攻击对方的话,首先还要得获取一个对方的属性,如生命、防御之类的,如果直接这样取得对象身上脚本的话,那也是行不通的。所以我想到的方式就是定义一个专门用于存放此变量的脚本,进行自己受到的伤害判定,其中的生命和防御都来自于物体的主要脚本,然后受到的伤害都可以在此计算,之后再将伤害同步到主要脚本中.....或许我的表达能力有点问题,感觉还没说秦楚的样子.....

不过,下面先一步步解释下吧:

首先在_Script文件夹中建立一个脚本,名为“BattleChange”,这个脚本用于对战斗时对象的伤害判定,里面有如下几个基本属性:

public int m_life=0;//生命

public int m_magic=0;//魔法值

public int m_defense=0;//防御

public string m_name="无名";//名字

public bool m_isDead=false;//死掉了吗?

private int m_realAttack;//将伤害随机化

这些都是几个基本属性,然后可以将系统自动生成的Start和Update函数删掉,这里用不上他们了。

在下面定义一个公共的Damage函数,其中可以传入一个参数:

public void Damage(int m_attack)

{

}

那个传入的参数就是别的敌人对其的攻击力,接下来,就可以在此进行攻击的判定了:

if(m_life>0)

{

m_realAttack=(int)Random.Range(m_attack-m_attack*0.25f,m_attack+m_attack*0.25f);//随机伤害值,范围在正负25%以内

Debug.Log ("伤害:"+m_realAttack);

if(m_realAttack-m_defense>0)

{

m_life-=(m_realAttack-m_defense);

}else

{

m_life-=1;

}

if(m_life<=0)

{

m_life=0;

m_isDead=true;

}

}

这些函数的作用就是通过对方的攻击对生命值进行加减,通过将传入的攻击力进行正负25%波动的后(这样可以免得攻击力),再进行实际伤害判定,如果攻击力超过防御,就受到攻击减去防御力的伤害,或者如果无法破防,就强制扣除一点生命。如果生命小于等于零,就将生命置为零,并将物体设定为“死亡”状态。

好,那么现在打开_Script下的PlayerControl脚本,在这个脚本中需要定义一个函数对BattleChange脚本中的数据进行同步。首先需要在”对象”标签中BattleChange脚本对象的定义:

private BattleChange m_changeState;//战斗时改变生命等属性脚本对象

并在Start函数中获取BattleChange脚本对象,同时为其变量赋值:

m_changeState=GetComponent();

m_changeState.m_defense=m_defense;//防御

m_changeState.m_life=m_currentLife;//生命

m_changeState.m_magic=m_currentMagic;//魔法值

然后在末尾定义一个名为GetState的函数,负责对数据进行同步:

void GetState()

{

m_currentLife=m_changeState.m_life;

m_currentMagic=m_changeState.m_magic;

}

最后在Update函数中加上GetState函数调用即可。

玩家判定伤害这儿就算完成了,接下来是对敌人的主脚本的修改。对敌人的主脚本修改就比较简单了直接在原本实例化攻击粒子效果之后加上发射一条射线,获取所碰撞到的对象BattleChange脚本即可:

if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,out

m_hit,m_attackRadius,m_layerMask))

{

m_skillRandom=Random.value;

if(m_skillRandom<0.96f)//大概有4%的几率发出技能

{

m_animation.CrossFade(m_animationAttack);//攻击动画

Instantiate(m_attackParticle,m_hit.collider.gameObject.transform.position+Vector3.up,Quat ernion.identity);//攻击,实例化一个粒子

m_damageT arget=m_hit.collider.gameObject.GetComponent();

audio.PlayOneShot(m_attackSound);//播放声音

m_damageT arget.Damage(m_attack);//调用对象的伤害函数

if(m_damageTarget.m_isDead)//如果攻击目标死掉了的话,就回到Idle 状态吧

{

m_isIdle=true;

}

}else

{

m_animation.CrossFade(m_animationSkill);

Instantiate(m_skillParticle,m_hit.collider.gameObject.transform.position+Vector3.up,Quater nion.identity);//攻击,实例化一个技能粒子

m_damageT arget=m_hit.collider.gameObject.GetComponent();

audio.PlayOneShot(m_skillSound);

m_damageT arget.Damage(m_attack*3);

if(m_damageTarget.m_isDead)//如果攻击目标死掉了的话,就回到Idle 状态吧

{

m_isIdle=true;

}

}

m_attackDelay=2;

}

现在再运行游戏,小狼对玩家的攻击已经正常了,如图:

不过在玩家生命数低于0时,也就是死亡后,小狼还是在烦人地不停地攻击,这点可以修改一下敌人主脚本中Update函数中的射线碰撞进行判断,只需要添加一行代码就可以了;

if(m_attackTarget.GetComponent().m_life!=0)

{

m_isIdle=false;

}

敌人的可以攻击了!

可是玩家自己的角色角还只能站着挨打或者跑?太不妥当了!

那么,现在就打开PlayerControl脚本,老样子,首先还是在前面的“变量”标签中定义三个变量:private RaycastHit hit;

private Vector3 m_forward;//向前的方向

private LayerMask m_layerMask;//射线检测层

其中那个层遮罩还必须在Start中初始化:m_layerMask=https://www.sodocs.net/doc/9b1989750.html,ToLayer("Human");

然后是在最后添加一个函数,我就起名叫Attack罢:

void Attack()

{

if(m_currentLife>0)

{

if(Input.GetMouseButtonDown(0))

{

m_animation.CrossFade("Attack3-2");

m_forward=m_transform.TransformDirection(Vector3.forward);

if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,hit,2,m_layerMask))

{

}

}

}

}

以上的代码足以让角色可以攻击,不过却造成不了伤害。现在在开始的“对象”标签中,定义一个普通攻击的粒子效果以及音效和一个攻击对象:

public Transform m_attackParticle;//普通攻击粒子

public AudioClip m_attackAudio;//普通攻击音效

private BattleChange m_nowAttackTarget;//当前攻击对象

然后再上面的Atack函数中判定射线是否碰撞到物体语句里面就可以引用了:

if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,out hit,2,m_layerMask)) {

m_nowAttackTarget=hit.collider.gameObject.GetComponent();

Instantiate(m_attackParticle ,m_nowAttackTarget.transform.position+Vector3.up,Quate rnion.identity);

audio.PlayOneShot(m_attackAudio);

m_nowAttackTarget.Damage(m_attack);

}

写好后再在Update函数调用。为了使敌人能够受到伤害,也还得为敌人绑定一个BattleChange脚本,并在敌人主脚本中的“对象”标签中进行定义:

private BattleChange m_changeState;//战斗时改变生命等属性脚本对象

然后在Start中初始化:

m_changeState=GetComponent();

m_changeState.m_defense=m_defense;

m_changeState.m_life=m_currentLife;

最后就跟主脚脚本一样,写一个GetState函数:

void GetState()

{

m_currentLife=m_changeState.m_life;

}

不要忘了在Update函数中调用。

最后在小狼身上加上一个Rigidbody和一个球型碰撞器,调整一下位置,运行游戏,就可以产生攻击以及伤害了。

不过在这儿如玩家人物也存在攻击过快的问题,所以同样也需要进行攻击延时。

定义一个变量:private float m_attackDelay=0;

然后修改一下Attack函数:

if(m_currentLife>0)

{

m_attackDelay-=Time.deltaTime;

if(Input.GetMouseButtonDown(0))

{

if(m_attackDelay<0)

{

m_animation.CrossFade("Attack3-1");

m_forward=m_transform.TransformDirection(Vector3.forward);

if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,out hit,2,m_layerMask))

{

m_nowAttackTarget=hit.collider.gameObject.GetComponent();

Instantiate(m_attackParticle ,m_nowAttackTarget.transform.position+Vector3.up,Quaternion .identity);

audio.PlayOneShot(m_attackAudio);

m_nowAttackTarget.Damage(m_attack);

}

m_attackDelay=1.3f;

}

}

}

现在1.3秒只能攻击一次了

可是,看起来却僵硬惨了......

有时候动画与动作也根本不协调,不过现在天色已晚,下次再来慢慢修复这些小地方吧。

unity3d学习游戏开发心得

Unity3D 学习游戏开发心得 罗佳 小组排名:黄馨然,罗佳在这将近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贴图。

材料科学基础知识点总结

金属学与热处理总结 一、金属的晶体结构 重点内容:面心立方、体心立方金属晶体结构的配位数、致密度、原子半径,八面体、四面体间隙个数;晶向指数、晶面指数的标定;柏氏矢量具的特性、晶界具的特性。 基本内容:密排六方金属晶体结构的配位数、致密度、原子半径,密排面上原子的堆垛顺序、晶胞、晶格、金属键的概念。晶体的特征、晶体中的空间点阵。 晶胞:在晶格中选取一个能够完全反映晶格特征的最小的几何单元,用来分析原子排列的规律性,这个最小的几何单元称为晶胞。 金属键:失去外层价电子的正离子与弥漫其间的自由电子的静电作用而结合起来,这种结合方式称为金属键。 位错:晶体中原子的排列在一定范围内发生有规律错动的一种特殊结构组态。 位错的柏氏矢量具有的一些特性: ①用位错的柏氏矢量可以判断位错的类型;②柏氏矢量的守恒性,即柏氏矢量与回路起点及回路途径无关;③位错的柏氏矢量个部分均相同。 刃型位错的柏氏矢量与位错线垂直;螺型平行;混合型呈任意角度。 晶界具有的一些特性: ①晶界的能量较高,具有自发长大和使界面平直化,以减少晶界总面积的趋势;②原子在晶界上的扩散速度高于晶内,熔点较低;③相变时新相优先在晶界出形核;④晶界处易于发生杂质或溶质原子的富集或偏聚;⑤晶界易于腐蚀和氧化;⑥常温下晶界可以阻止位错的运动,提高材料的强度。 二、纯金属的结晶 重点内容:均匀形核时过冷度与临界晶核半径、临界形核功之间的关系;细化晶粒的方法,铸锭三晶区的形成机制。 基本内容:结晶过程、阻力、动力,过冷度、变质处理的概念。铸锭的缺陷;结晶的热力学条件和结构条件,非均匀形核的临界晶核半径、临界形核功。 相起伏:液态金属中,时聚时散,起伏不定,不断变化着的近程规则排列的原子集团。 过冷度:理论结晶温度与实际结晶温度的差称为过冷度。 变质处理:在浇铸前往液态金属中加入形核剂,促使形成大量的非均匀晶核,以细化晶粒的方法。 过冷度与液态金属结晶的关系:液态金属结晶的过程是形核与晶核的长大过程。从热力学的角度上看,

Unity3D游戏开发作品大盘点

经典重现《新仙剑OL》 《新仙剑OL》采用跨平台Unity3D引擎,耗资数千万,历时三年多,由台湾大宇正版授权,“仙剑之父”姚壮宪监制的全球首款Unity3D航母级双端(网页和客户端)中国风MMORPG网络游戏巨作。主打温情牌并且延续了仙剑系列的国风雅韵,人物塑造细腻唯美,场景构建精致逼真。 《蒸汽之城》(City of Steam) 由国内游戏公司参与开发的Unity3D页游《蒸汽之城》(City of Steam)在北美地区呼声颇高,该作是基于U3D引擎的纯3D角色扮演类网页游戏,它拥有目前市面上少有的360度镜头旋转纯3D画面,能给玩家带来3D客户端游戏体验。该作于不久前在北美开

启内测,反响较好。 角色扮演游戏《推倒Online》 《推倒Online》是一款由Unity3D游戏引擎开发,角色扮演、实时战斗为主,辅以社区交际元素的Q版3D网页游戏,由沈阳坐标科技于2010年11月公司创立之初开始设计研发。游戏以魔族崛起为世界背景,通过魔族勇士穿越封印征战大陆为引,展开剧情!制作宗旨走反传统搞怪路线,或可爱、或憨厚、或个性的美式魔幻卡通风格,简洁而不失质感。游戏以新颖的战斗模式、激烈的空间攻占、多样的生活交际经历为主要玩点,兼顾技能升级、装备合成、人物属性进化、游戏内小游戏等常规玩法的扩展,给玩家带来了全新的游戏盛宴。【狗刨学习网】

ARPG武侠《绝代双骄》 《绝代双骄》是一款纯中国风武侠ARPG即时战斗网页游戏,采用古龙经典小说为背景,3D游戏画面、无职业角色成长、推图式关卡副本、鼠标右键施放轻功、场景自由反馈等特色内容,为玩家带来非同凡响的3D武侠游戏体验。基于Unity3D游戏引擎,该作在武术特效上做了相当大的细节处理,无拘束轻功飞行、酣畅淋漓的打击感、刀刀见血拳拳到肉,都为游戏带来非常好的口碑。该作近期正在封测当中,有兴趣的玩家不妨关注一下。

Unity3D游戏开发之网络游戏服务器架构设计(如何做一名好主程)

Unity3D游戏开发之网络游戏服务器架构设计培训 (如何做一名好主程) 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序。在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1、服务器跑在什么样的操作系统环境下? 2、采用哪几种语言开发?主要是什么? 3、服务器和客户端以什么样的接口通讯? 4、采用哪些第三方的类库? 除了技术背景之外,考虑这些问题的时候一定要充分考虑项目需求和所能拥有的资源。 我觉得,先不要想一组需要几台机器各有什么功能这样的问题,也不要想需要多少个daemon 进程。假设就一台服务器,就一个进程,把所需要的资源往最小了考虑,把架构往最简单的方向想,直到发现,“哦,这么做无法满足策划要求的并发量”,再去修改设计方案。 操作系统:越单一越好。虽然FreeBSD的网络性能更好、虽然Solaris非常稳定,但选什么就是什么,最好别混着来。前端是FreeBSD,后端是Solaris,运营的人会苦死。也不要瞧不起用Windows的人,用Windows照样也能支持一组一万人在线,总之,能满足策划需求,好招程序员,运营成本低是要点。不同的操作系统有不同的特性,如果你真的对它们都很熟悉,那么必定能找到一个理由,一个足够充分的理由让你选择A而不是B而不是C。但做决策的时候要注意不要因小失大。 Programming Language:传统来说,基本都是C/C++。但是你也知道,这东西门槛很高,好的C/C++程序员很难招。用Perl/Python/Lua行不行?当然可以。但是纯脚本也不好,通常来说是混合着来。你要明白哪些是关键部分,我是说执行次数最多的地方而不是说元宝,这些必须用性能高的语言实现(比如C/C++比如Java),其它像节日活动这样很久才执行一次的,随便吧。脚本的好处是,可以快速搭原型。所以,尽早的,在你做完基本的地图和战斗模块之后,立马跑机器人测试吞吐量。这时候项目开发进度还不到10%,不行就赶紧改。 此处特别举个例子就是Java GC的问题。既然你要用java,而jvm需要通过执行garbage collection来回收内存,而garbage collection会使整个应用停顿,那你不妨试一试,内存在达到峰值的时候会停多久?策划可以接受吗?如果不可以,你可以采用其它的GC策略再试一试。这个问题应该不是Java独有的。网游和网站应用相比它很注重流畅性。这是你务必需要考虑的。 至于选择什么样的脚本语言,以及脚本在你的游戏中究竟是占80%还是20%?需要根据需求来看。有没有游戏完全不用脚本?有。有没有游戏滥用脚本?也有。如果你引入脚本的目的是因为策划不会C/C++而你希望策划能自己独立实现更多的游戏功能。你希望策划去写脚本?脚本也是程序,策划写的脚本难道就比程序员写脚本好?还是因为策划工资便宜?策划

Unity3D游戏开发之塔防游戏项目讲解(上)

[Unity3D]Unity3D游戏开发之塔防游戏项目讲解(上) 通常意义上讲,塔防游戏是指一类在地图上建造炮台或者类似建筑物来阻止敌人进攻 的策略类游戏。从这个概念中,我们可以快速地抽离出来三个元素,即地图(场景)、敌人、炮台(防守单位)。当我们抽离出来这样三个元素后,现在塔防游戏就变成了这样的一种描述,即敌人按照地图中设计的路径进攻,玩家利用防守单位进行防守的一类策略游戏。经 典的塔防游戏有哪些呢?比如我们最为熟悉的《植物大战僵尸》、《保卫萝卜》都是塔防 类游戏的经典游戏。如果我们将塔防游戏中的防守单位的范围扩大到玩家,那么像《英雄 联盟》这样的游戏同样是可以称之为塔防游戏的,因为敌我阵营的最终目的都是要摧毁敌 方的防御塔,只是敌我双方都从炮台或者怪物变成了有血有肉的人物,加之角色扮演(RPG)和即时战略(RTS)等元素的混合渗透,使得这样的游戏从单纯的塔防游戏变成了一款可玩 度极高的游戏(天啊,我居然在夸这个游戏.....)。好了,那么我们就来尝试着做出一个简单 的塔防游戏吧,注意是简单的塔防游戏哦,既然塔防游戏的三个要素是地图、敌人和防守 单位,那么我们就从这三个方面来着手设计这个游戏吧!在本篇文章中,我们将用到下面 的知识: ?Unity2D中的Sprite动画 ?Unity3D中的可视化辅助类Gizmos ?塔防游戏中敌人按路径寻路的实现 ?Unity3D uGUI的初步探索 ?简单的AI算法 一、地图篇 地图是一个塔防游戏中玩家最为关注的地方,因为地图和敌人将直接影响到玩家的策略。如图是从《保卫萝卜》游戏中提取的一张游戏地图。在这张地图中我们可以清楚看到 怪物进攻的路径,怪物将沿着地图中的路径向我方防守单位发起攻击。那么,在游戏中, 我们该怎样确定怪物的攻击路径呢?首先我们可以对地图进行下分析,在地图中基本上基 本上只有两种类型的区域,即可以放置防守单位的区域和不可放置防守单位的区域两种。 由此我们可以设计出下面的结构:

材料科学基础笔记

第一章材料中的原子排列 第一节原子的结合方式 1 原子结构 2 原子结合键 (1)离子键与离子晶体 原子结合:电子转移,结合力大,无方向性和饱和性; 离子晶体;硬度高,脆性大,熔点高、导电性差。如氧化物陶瓷。 (2)共价键与原子晶体 原子结合:电子共用,结合力大,有方向性和饱和性; 原子晶体:强度高、硬度高(金刚石)、熔点高、脆性大、导电性差。如高分子材料。 (3)金属键与金属晶体 原子结合:电子逸出共有,结合力较大,无方向性和饱和性; 金属晶体:导电性、导热性、延展性好,熔点较高。如金属。 金属键:依靠正离子与构成电子气的自由电子之间的静电引力而使诸原子结合到一起的方式。 (3)分子键与分子晶体 原子结合:电子云偏移,结合力很小,无方向性和饱和性。 分子晶体:熔点低,硬度低。如高分子材料。 氢键:(离子结合)X-H---Y(氢键结合),有方向性,如O-H—O (4)混合键。如复合材料。 3 结合键分类 (1)一次键(化学键):金属键、共价键、离子键。 (2)二次键(物理键):分子键和氢键。 4 原子的排列方式 (1)晶体:原子在三维空间内的周期性规则排列。长程有序,各向异性。 (2)非晶体:――――――――――不规则排列。长程无序,各向同性。 第二节原子的规则排列 一晶体学基础 1 空间点阵与晶体结构 (1)空间点阵:由几何点做周期性的规则排列所形成的三维阵列。图1-5 特征:a 原子的理想排列;b 有14种。 其中: 空间点阵中的点-阵点。它是纯粹的几何点,各点周围环境相同。 描述晶体中原子排列规律的空间格架称之为晶格。 空间点阵中最小的几何单元称之为晶胞。 (2)晶体结构:原子、离子或原子团按照空间点阵的实际排列。 特征:a 可能存在局部缺陷;b 可有无限多种。 2 晶胞图1-6 (1)――-:构成空间点阵的最基本单元。 (2)选取原则: a 能够充分反映空间点阵的对称性; b 相等的棱和角的数目最多; c 具有尽可能多的直角; d 体积最小。 (3)形状和大小 有三个棱边的长度a,b,c及其夹角α,β,γ表示。 (4)晶胞中点的位置表示(坐标法)。 3 布拉菲点阵图1-7 14种点阵分属7个晶系。 4 晶向指数与晶面指数 晶向:空间点阵中各阵点列的方向。 晶面:通过空间点阵中任意一组阵点的平面。 国际上通用米勒指数标定晶向和晶面。

Unity3D游戏开发菜鸟快速上手指南

大家对Unity3D游戏引擎应该并不陌生,因为Unity3D在轻量级游戏开发和跨平台上面有他独特的优势,所以在当前可谓是炙手可热。17xuee游戏学院简单介绍了Unity3D的一些基础。并且有部分内容根据天天飞车项目经验做了简单分析。适合没有接触过Unity3D和手游开发,并想了解其大概的同学。 1Unity3D简介 1.1编辑器简介 编辑器整体视图如图1.1所示。里面包括了Unity常用的编辑窗口: 图1.1 Unity编辑器界面 Project视图、Hierarchy视图、Scene视图、Game视图、Inspector视图、Console视图、Profiler视图。 1.1.1Project视图 Project视图可以理解为工程目录,里面罗列了工程里面的所有资源文件。常见的资源包括:脚本、预设(Prefab)、模型、贴图、动画、Shader等。用户可以通过右上角的搜索框,搜索工程内的文件。

1.1.2Hierarchy视图 Hierarchy视图显示了当前游戏场景中,所有的游戏对象。游戏对象是通过树形结构排布,展开后可以看到每个子节点对象。常用的游戏对象包括:摄像机、场景物件、玩家、光源等。 1.1.3Game视图 Game视图是游戏视角,即游戏最终展示给玩家的内容。游戏视角包括两部分:1、场景中当前摄像机照射的场景;2、游戏UI界面。 1.1.4Scene视图 Scene视图有点像3DMax的编辑环境,在这里可以看到当前场景中的所有游戏对象。双击Hierarchy中的游戏对象,可以在Scene中定位到对应的物件。在游戏运行期间,暂停游戏。开发人员可以在Scene中找到对应的游戏对象,查看当前帧的世界场景,方便查找BUG。 1.1.5Inspector视图 Inspector视图是游戏对象的属性面板。选择一个物件后,可以在Inspector面板中查看或编辑游戏对象的属性。游戏运行期间,修改游戏对象属性,可以马上作用到游戏对象。这一特点对于美术的编辑、程序查BUG或者策划调整游戏参数有很大帮助。 Unity的游戏对象是通过Component(组件)控制的。常见的Component有:Transform(模型坐标)、Collider(碰撞检测器)、Rigidbody(刚体属性)、Animation(动画)、AudioSource (声音源)、Script(游戏脚本)等。 1.1.6Console视图 Console视图是控制台信息输出窗口。输出的信息包括:游戏脚本编译错误信息、游戏运行期间的日志输出、断言、崩溃信息。

基于unity3d游戏设计开发

分类号论文选题类型 U D C 编号 本科毕业论文(设计) 题目基于Unity3D 的android 手机赛车游戏的设计与开发 院(系)信息与新闻传播学院 专业教育技术学 年级2009 学生姓名尹超凡 学号2009214026 指导教师赵刚 二○一三年五月

华中师范大学 学位论文原创性声明 本人郑重声明:所呈交的学位论文是本人在导师指导下独立进行研究工作所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。 学位论文作者签名:日期:年月日 学位论文版权使用授权书 本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士学位论文评选机构将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。 本学位论文属于 1、保密□,在_____年解密后适用本授权书。 2、不保密□。 (请在以上相应方框内打“√”) 学位论文作者签名:日期:年月日 导师签名:日期:年月日

目录 内容摘要 (1) 关键词 (1) Abstract (1) Key words (1) 1.引言 (2) 1.1研究背景 (2) 1.2研究意义 (2) 1.3本文结构 (3) 2. 研究主要内容 (3) 2.1 研究方法及手段 (3) 2.2 技术路线 (4) 2.3 开发环境 (4) 2.4运行环境 (6) 3. Unity3D简介 (6) 3.1总体概述 (6) 3.2软件特色 (6) 3.3Unity3D 包的使用 (8) 3.4.Unity3D 发布平台 (9) 4.游戏的总体设计 (9) 4.1游戏目标 (9) 4.2 游戏框架 (9) 4.3游戏界面设计 (10) 5.游戏功能的实现 (11) 5.1碰撞检测的实现 (11) 5.2 terrain 地形的创建 (12) 5.3 prefab 树的创建 (16) 5.4 赛车方向改变和加速减速的实现 (18) 6.总结 (19) 致谢 (23) 参考文献 (24)

材料科学基础知识点汇总

材料科学基础知识点汇总

————————————————————————————————作者:————————————————————————————————日期:

金属学与热处理总结 一、金属的晶体结构 重点内容: 面心立方、体心立方金属晶体结构的配位数、致密度、原子半径,八面体、四面体间隙个数;晶向指数、晶面指数的标定;柏氏矢量具的特性、晶界具的特性。 基本内容:密排六方金属晶体结构的配位数、致密度、原子半径,密排面上原子的堆垛顺序、晶胞、晶格、金属键的概念。晶体的特征、晶体中的空间点阵。 晶格类型 fcc(A1) bcc(A2) hcp(A3) 间隙类型 正四面体 正八面体 四面体 扁八面体 四面体 正八面体 间隙个数 8 4 12 6 12 6 原子半径r A a 4 2 a 4 3 2 a 间隙半径r B ( ) 4 23a - ()4 22a - ( )4 35a - ()4 32a - ( )4 26a - ( ) 2 12a - 晶胞:在晶格中选取一个能够完全反映晶格特征的最小的几何单元,用来分析原子排列的规律性,这个最小的几何单元称为晶胞。 金属键:失去外层价电子的正离子与弥漫其间的自由电子的静电作用而结合起来,这种结合方式称为金属键。 位错:晶体中原子的排列在一定范围内发生有规律错动的一种特殊结构组态。 位错的柏氏矢量具有的一些特性: ①用位错的柏氏矢量可以判断位错的类型;②柏氏矢量的守恒性,即柏氏矢量与回路起点及回路途径无关;③位错的柏氏矢量个部分均相同。 刃型位错的柏氏矢量与位错线垂直;螺型平行;混合型呈任意角度。 晶界具有的一些特性: ①晶界的能量较高,具有自发长大和使界面平直化,以减少晶界总面积的趋势;②原子在晶界上的扩散速度高于晶内,熔点较低;③相变时新相优先在晶界出形核;④晶界处易于发生杂质或溶质原子的富集或偏聚;⑤晶界易于腐蚀和氧化;⑥常温下晶界可以阻止位错的运动,提高材料的强度。 二、纯金属的结晶 重点内容:均匀形核时过冷度与临界晶核半径、临界形核功之间的关系;细化晶粒的方法,铸锭三晶区的形成机制。 基本内容:结晶过程、阻力、动力,过冷度、变质处理的概念。铸锭的缺陷;结晶的热力学条件和结构条件,非均匀形核的临界晶核半径、临界形核功。 相起伏:液态金属中,时聚时散,起伏不定,不断变化着的近程规则排列的原子集团。 过冷度:理论结晶温度与实际结晶温度的差称为过冷度。 变质处理:在浇铸前往液态金属中加入形核剂,促使形成大量的非均匀晶核,以细化晶粒的方法。 过冷度与液态金属结晶的关系:液态金属结晶的过程是形核与晶核的长大过程。从热力学的角度上看,没有过冷度结晶就没有趋动力。根据 T R k ?∝1可知当过冷度T ?为零时临界晶核半径R k 为无穷大,临界形核功(2 1T G ?∝?)也为无穷大。临界晶 核半径R k 与临界形核功为无穷大时,无法形核,所以液态金属不能结晶。晶体的长大也需要过冷度,所以液态金属结晶需要过冷度。 细化晶粒的方法:增加过冷度、变质处理、振动与搅拌。 铸锭三个晶区的形成机理:表面细晶区:当高温液体倒入铸模后,结晶先从模壁开始,靠近模壁一层的液体产生极大的过冷,加

unity3d开发过哪些游戏

unity3d开发过哪些游戏 unity,也称unity3d,是近几年非常流行的一个3d游戏开发引擎,跨平台能力强,使用它开发的手机游戏数不胜数。unity3d开发过哪些游戏?Unity3D游戏作品大盘点! 经典重现《新仙剑OL》 《新仙剑OL》采用跨平台Unity3D引擎,耗资数千万,历时三年多,由台湾大宇正版授权,“仙剑之父”姚壮宪监制的全球首款Unity3D航母级双端(网页和客户端)中国风MMORPG网络游戏巨作。主打温情牌并且延续了仙剑系列的国风雅韵,人物塑造细腻唯美,场景构建精致逼真。

Unity3D作品大盘点 《蒸汽之城》(City of Steam) 由国内游戏公司参与开发的Unity3D页游《蒸汽之城》(City of Steam)在北美地区呼声颇高,该作是基于U3D引擎的纯3D角色扮演类网页游戏,它拥有目前市面上少有的360度镜头旋转纯3D画面,能给玩家带来3D客户端游戏体验。该作于不久前在北美开启内测,反响较好。 Unity3D作品大盘点 角色扮演游戏《推倒Online》

《推倒Online》是一款由Unity3D游戏引擎开发,角色扮演、实时战斗为主,辅以社区交际元素的Q版3D网页游戏,由沈阳坐标科技于2010年11月公司创立之初开始设计研发。游戏以魔族崛起为世界背景,通过魔族勇士穿越封印征战大陆为引,展开剧情!制作宗旨走反传统搞怪路线,或可爱、或憨厚、或个性的美式魔幻卡通风格,简洁而不失质感。游戏以新颖的战斗模式、激烈的空间攻占、多样的生活交际经历为主要玩点,兼顾技能升级、装备合成、人物属性进化、游戏内小游戏等常规玩法的扩展,给玩家带来了全新的游戏盛宴。 Unity3D游戏作品大盘点 ARPG武侠《绝代双骄》

unity 3D游戏开发

unity 3D游戏开发 毕业设计 题目 Unity3D游戏开发院系计算机科学与工程系专业计算机科学与技术年级 2011 学号 姓名 指导教师讲师 2015年 3 月 28 日 教务处制 毕业设计书原创性声明 本人郑重声明:所呈交的设计书是本人在指导教师的指导下独立进行研究所取得的研究成果。除了设计书中特别加以注明引用的内容外~本设计书不包含任何其他个人或集体已经发表或撰写的成果作品。本人完全意识到本声明的法律后果由本人承担。 毕业设计书作者签名 年月日 毕业设计书版权使用授权书 本毕业设计书作者完全了解学校有关保障、使用毕业设计书的规定~同意学校保留并向有关学位设计书管理部门或机构送交设计书的复印件和电子版~允许设计书被查阅和借阅。本人授权省级优秀学士学位设计书评选机构将本设计书全部或部分内容编入有关数据库进行检索~可以采用影印、缩印或扫描等复制手段保存和汇编本学位设计书。 本设计书属于: 保密?~在年解密后适用本授权书。

不保密?。 ,请在以上相应的方框内打“?”, 作者签名年月日 指导教师签名年月日 目录 1 绪论 ................................................ 7 1.1 论文研究背景...................................................................... ........................... 7 1.2论文研究目的...................................................................... ............................ 7 1.3论文研究内容...................................................................... ............................ 8 2 游戏开发工具及可行性分 析 ............................. 9 2.1 游戏主要开发引擎...................................................................... ................... 9 2.2 开发可行性分析...................................................................... ....................... 9 2.3本章小结...................................................................... .................................. 10 3游戏设 计 ............................................ 11 3.1 总体设计...................................................................... ................................. 11 3.1.1 游戏介

赵品《材料科学基础教程》(第3版)笔记和课后习题(含考研真题)详解 第1章 材料的结构【圣才出品】

第1章材料的结构 1.1复习笔记 一、材料的结合方式 1.化学键 (1)定义 组成物质整体的质点(原子、分子或离子)间的相互作用力称为化学键。 (2)分类 ①共价键 a.定义 同类原子或电负性相差不大的原子互相接近时,原子之间不产生电子的转移,而是借共用电子对所产生的力结合,形成的键被称为共价键。 b.特点 既有方向性又有饱和性。 ②离子键 a.定义 当两种电负性相差大的原子相互靠近时,其中电负性小的原子失去电子,成为正离子,电负性大的原子获得电子,成为负离子,两种离子靠静电引力结合在一起形成的键被称为离子键。 b.特点 离子键无方向性和饱和性。

③金属键 a.定义 由金属正离子和自由电子之间互相作用而结合形成的键称为金属键。 b.特点 金属键无方向性和饱和性 c.电子气理论 金属原子的结构特点是外层电子少,容易失去。当金属原子相互靠近时,其外层的价电子脱离原子成为自由电子,为整个金属所共有,它们在整个金属内部运动,形成电子气。 ④范德瓦尔键 分子的一部分往往带正电荷,而另一部分往往带负电荷,一个分子的正电荷部位和另一分子的负电荷部位间,以微弱静电力相吸引,使之结合在一起形成的键,称为范德瓦尔键,又称分子键。 2.工程材料的键性 在实际的工程材料中,原子(或离子、分子)间相互作用的性质,只有少数是以上四种键型的极端情况,大多数是这四种键型的过渡。如果以四种键为顶点,作个四面体,就可把工程材料的结合键范围示意在四面体上,如图1-1-1所示。

图1-1-1工程材料键性 二、晶体学基础 1.晶体与非晶体 (1)原子排列的三个等级(不考虑原子的结构缺陷) 无序排列,短程有序和长程有序。 (2)晶体 ①定义 物质的质点(分子、原子或离子)在三维空间作有规律的周期性重复排列所形成的物质称为晶体。 ②特点 a.晶体具有一定的熔点。 b.晶体具有各向异性:晶体的某些物理性能和力学性能在不同方向上具有不同的数值。 (3)非晶体 ①定义 在整体上是无序的,但原子间也靠化学键结合在一起,故在有限的小范围内观察还有一定规律,即近程有序,这样的物质称为非晶体。 ②特点 a.非晶体不具有一定的熔点,它实质上是一种过冷的液体结构,往往被称为玻璃体。 b.非晶体具有各向同性。 2.空间点阵 将晶体看成是无错排的理想晶体,忽略其物质性,抽象为规则排列于空间的无数几何点。

《材料科学基础》考研复习笔记

《材料科学基础》考研复习笔记 第一章材料中的原子排列 第一节原子的结合方式 1 原子结构 2 原子结合键 (1)离子键与离子晶体 原子结合:电子转移,结合力大,无方向性和饱和性; 离子晶体;硬度高,脆性大,熔点高、导电性差。如氧化物陶瓷。 (2)共价键与原子晶体 原子结合:电子共用,结合力大,有方向性和饱和性; 原子晶体:强度高、硬度高(金刚石)、熔点高、脆性大、导电性差。如高分子材料。 (3)金属键与金属晶体 原子结合:电子逸出共有,结合力较大,无方向性和饱和性; 金属晶体:导电性、导热性、延展性好,熔点较高。如金属。 金属键:依靠正离子与构成电子气的自由电子之间的静电引力而使诸原子结合到一起的方式。 (3)分子键与分子晶体 原子结合:电子云偏移,结合力很小,无方向性和饱和性。 分子晶体:熔点低,硬度低。如高分子材料。 氢键:(离子结合)X-H---Y(氢键结合),有方向性,如O-H—O (4)混合键。如复合材料。 3 结合键分类 (1)一次键(化学键):金属键、共价键、离子键。 (2)二次键(物理键):分子键和氢键。 4 原子的排列方式 (1)晶体:原子在三维空间内的周期性规则排列。长程有序,各向异性。 (2)非晶体:――――――――――不规则排列。长程无序,各向同性。 第二节原子的规则排列 一晶体学基础 1 空间点阵与晶体结构 (1)空间点阵:由几何点做周期性的规则排列所形成的三维阵列。图1-5 特征:a 原子的理想排列;b 有14种。 其中: 空间点阵中的点-阵点。它是纯粹的几何点,各点周围环境相同。 描述晶体中原子排列规律的空间格架称之为晶格。 空间点阵中最小的几何单元称之为晶胞。 (2)晶体结构:原子、离子或原子团按照空间点阵的实际排列。 特征:a 可能存在局部缺陷; b 可有无限多种。 2 晶胞图1-6 (1)――-:构成空间点阵的最基本单元。 (2)选取原则: a 能够充分反映空间点阵的对称性; b 相等的棱和角的数目最多; c 具有尽可能多的直角; d 体积最小。 (3)形状和大小

Unity3D游戏开发之制作一个简单的NPC

Unity3D游戏开发之制作一个简单的NPC 简单的NPC 前几天看了cgcookie的一个教程,学习了下怎么根据已有人物模型制作一个仿版的NPC人物,感觉挺好玩的,整理一下放到博客里! 先看一下教程里面的最终效果。 是不是很像个幽灵~ 下面是我在自己的工程中实验的结果。

中间是游戏角色,两遍两个就是NPC啦。 文章出处【狗刨学习网】 这种技术得到的效果和贴图关系很大,所以如果效果不好再画一张贴图吧 2. 实现 实现非常简单,一共包含三个部分:改变Mesh材质,给Mesh添加Particle,最后添加闪烁的脚本 2.1 改变Mesh材质

首先新建一个空白对象,可以命名为holo_character,给它添加Mesh Filter和Mesh Render组件。 将原模型的Mesh赋值给上述Mesh Filter组件。然后新建一个材质,并赋值给Mesh Render组件来替换原来的模型材质。新的材质使用Particles/Additive的Shader,贴图属性中使用这个NPC的贴图,也也可以直接使用原模型的材质贴图。材质颜色可以根据喜好自行调节。面板设置如下: 如果你的模型包含多个Mesh,例如头和身体是分开的,那么对每个部分都做如上操作就行了。 现在你的NPC应该看起来幽灵化了。 2.2 给Mesh添加Particle 给holo_character依次添加Mesh Particle Emitter、Particle Animator和Particle Render组件。将上一步新建的材质赋值给Particle Render中的材质对象。到了这里基本外观就出来了。

材料科学基础知识点总结

一、基本知识点 1.结合键与晶体学基础(1)化学键包括离子键:静电吸引作用共价键金属键:金属正离子与自由电子之间的相互作用构成的金属原子间的结合力。没有方向性和饱和性。(理论包括自由电子模型和能带理论) 物理键包括 范德华键:包括3种,静电力、诱导力、色散力。特点有:1、存在于分子或原子间的一种较弱的吸引力 2、作用能约为几十个kj/mol,比化学键小1-2数量级 3、一般没有方向性和饱和性。 氢键:存在于含氢的物质,与范德华健不同的是,氢键是有方向性和饱和性的较强的分子间力。 (2)晶体:是内部质点(原子、分子或离子)在三维空间以周期性重复方式作有规则的排列的固体,即晶体是具有格子构造的固体(1、有确定的熔点2、各向异性,即不同方向性能不同)。非晶体:原子散乱分布或仅有局部区域的短程规则排列。玻璃相: 相:材料中均匀而具有物理特性的部分,并和体系的其他部分有明显界面的称为“相”(3)空间点阵:把由一系列在三维空间周期性排列的几何点阵成为一个空间点阵 晶胞:组成各种晶体构造的最小体积单位 晶面:在晶体结构内部中,由物质质点所组成的平面晶向:穿过物质的质点所组成的直线方向晶格:晶系:晶向族 晶面族:在晶体中有些晶面上原子排列和分布规律是完全相同的,晶面间距相同,而晶面在空间的位向不同,这样一组等同晶面称为一个晶面族同素异构 (4)八面体间隙四面体间隙 配位数:指在晶体结构中,该原子或离子的周围与其直接相邻结合的原子个数或所有异号离子的个数 致密度:一个晶胞中原子所占体积与晶胞体积的比值晶胞中的原子数 2、材料的结构 固溶体:将外来组元引入晶体结构,占据主晶相质点位置一部分或间隙位置一部分,仍保持一个晶相,这种晶体称为固溶体(即溶质溶解在溶剂中形成固溶体)。根据外来组元在主晶相中所处位置,可分为置换固溶体和间隙固溶体。按外来组元在主晶相中的固溶度,可分为有限固溶体和无限固溶体。 置换固溶体:溶质取代了溶剂中原子或离子所形成的固溶体 聚合度(等规度):在聚合物中的有规立构聚合的百分含量 3、晶体结构缺陷 肖脱基缺陷:离位原子迁移到外表面或内界面处,这种空位称肖脱基空位 弗兰克尔缺陷(空位):离位原子迁移到晶体点阵的间隙中,则称为弗兰克尔空位 间隙原子:形成弗兰克尔空位的同时将形成等量的间隙原子,间隙原子可以是晶体本身固有的同类原子(称自间隙原子),也可以是外来的异类间隙原子。 置换原子:将晶体中的原子置换的外来原子 刃位错:在晶体中有一个刀刃状的多余半原子面,所以称为刃型位错。(分正刃型位错和负刃型位错)(位错线和滑移方向垂直)螺位错:沿位错线原子面呈螺旋形,每绕轴一周,原子面上升一个原子间距,这种位错称螺型位错。分为左旋和右旋(右手法则、左手法则)(位错线和滑移方向平行) 混合位错:曲线和滑移方向既不垂直又不平行,原子排列介于螺型和刃型位错之间,称为混合型位错 柏氏回路:从实际晶体中的任意一个原子出发,围绕位错线作一个闭合回路,要求回路的方向和位错线的正方向成右螺旋关系,回路的每一步都连接相邻的原子,作回路时应避开位错线附近原子严重错排的区域。此回路称为柏氏回路 柏氏矢量:用形成位错的滑移矢量定义位错矢量,并称为柏氏矢量。(以b表示,只有位错

Unity3D游戏开发教程-Unity3D游戏引擎实战开发从入门到精通

unity3d游戏开发教程-Unity3D游戏引擎实战开发从入门到精通(坦克大战项目实战、NGUI开发、GameObject) 一、Unity3D游戏引擎实战开发从入门到精通课程是怎么样的一门课程(全面介绍) 1.1、unity3d游戏开发教程课程的背景现如今游戏已经成为了人们生活中不可或缺的一部分。不经意间,你在公交上,在地铁里,在商场中,办公室里,都可以看到各式各样的人在用不同的途径玩着各种各样的游戏。可以说,游戏是一个前景非常美好的行业。有PC端的玩家,有网页端的玩家,也有移动端的玩家。他们可以通过不同的途径来娱乐自己喜欢的游戏,走到哪里,都可以看到这些已经渗入到人们的生活里了。那么从程序的角度,要实现这些不同平台的互通,我们要怎么实现呢?如何通过一次编码,全平台运行呢?Unity3D就是本着这样的需求而诞生的。 unity3d游戏开发教程,Unity3D可以让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。已经实现了跨平台。可以在移动端,pc端和网页端互通了。一次编码,发布不同平台就可以了。所以现在Unity3D 也成为开发人员的首选编程语言了。其制作3D游戏,也就分分钟的问题。非常的方便。易懂易学。通过Unity简单的用户界面,玩家可以完成任何工作。这些为玩家节省了大量的时间。 所以本unity3d游戏开发教程课程将通过实例来讲解Unity3D的开发过程。由浅入深的,让学者快速的掌握Unity3D开发的要领及Unity3D的知识点。达到快速开发的目的。 1.2、Unity3D游戏引擎实战开发从入门到精通课程内容简介:unity3d游戏开发教程由浅入深的介绍Unity3D的开发流程。从软件使用到API接口的使用,从成品到优化。介绍整个Unity3D的基本开发过程及开发中碰到的基础问题进行深入讲解。对代码重构及代码优化做出示例,让学员能逐步的了解Unity3D开发的注意点。讲解Unity3D软件界面的使用,Unity3D组件的介绍,使用C#编写Unity3D 及Unity3D GUI(NGUI)的介绍和游戏简单AI的编写,让学员能够把握Unity3D开发的方向,成为一名合格的游戏开发人员。 1.3、Unity3D游戏引擎实战开发从入门到精通课程大纲: unity3d游戏开发教程第一讲:Unity3D引擎初识 unity3d游戏开发教程第二讲:GameObject认识 unity3d游戏开发教程第三讲:Unity3D组件添加一 unity3d游戏开发教程第四讲:Unity3D组件添加二 unity3d游戏开发教程第五讲:Unity3D组件添加三 unity3d游戏开发教程第六讲:资源的导入及预制 unity3d游戏开发教程第七讲:游戏地形的制作 unity3d游戏开发教程第八讲:NGUI三讲之第一讲 unity3d游戏开发教程第九讲:NGUI三讲之第二讲第十讲:NGUI三讲之第三讲第十一讲:Unity3D 实例预热第十二讲:实例-坦克组装一 unity3d游戏开发教程第十三讲:实例-坦克组装二第十四讲:实例-敌方AI一第十五讲:实例-敌方AI二第十六讲:实例-场景界面UI制作 unity3d游戏开发教程第十七讲:实例-游戏结束界面第十八讲:实例-游戏环境设置 unity3d游戏开发教程第十九讲:实例-游戏的发布

Unity3D游戏开发之跑酷游戏项目讲解

今天主题就是《Unity3D游戏开发之跑酷游戏项目讲解》。 一、游戏策划 游戏采用2D界面,角色从左到右奔跑,在路段中随机生成障碍物和金币,玩家需要使 用跳跃功能躲开障碍物,在游戏中玩家收集的金币数目越多,奔跑的距离越长,玩家的得分就越高。我们最终实现的界面效果如图所示,首先我们来讲一下游戏的原理,我们这里这里采用的方法是路段固定,移动摄像机的方法。换句话说,当角色开始移动后,摄像机和场景跟随角色缓缓向右移动。当角色跑完每一个路段距离的2/3时,计算下一路段的位置,并在该位置生成一个新的路段,这样在游戏场景中可以产生无限远的路段,当某一路段离开摄像机视野时,立即将其销毁。于此同时,我们在每一个路段上随机产生障碍物和金币,然后对角色做碰撞检测即可。

二、角色控制 角色控制这里,我们只关注角色的状态,即角色是处于奔跑状态还是死亡状态。通过 这一状态,我们针对角色采取不同的处理方式。如果角色处于奔跑状态,则更新角色位置、摄像机位置、背景位置,否则角色将在被障碍物撞到以后倒地死亡。我们来一起看下面的脚本: [csharp]view plaincopyprint? https://www.sodocs.net/doc/9b1989750.html,ing UnityEngine; https://www.sodocs.net/doc/9b1989750.html,ing System.Collections; 3. 4.public class Player : MonoBehaviour { 5. 6.//定义角色移动速度 7.public float mMoveSpeed=2.5F; 8. 9.//摄像机 10.private Transform mCamera; 11.//背景图片 12.private Transform mBackground; 13. 14.//角色是否在奔跑 15.private bool isRuning=true; 16.//场景中路段总数目 17.private int mCount=1; 18. 19.//路段预设 20.public GameObject CubeWay; 21. 22.//死亡动画播放次数 23.private int DeathCount=0; 24. 25.//收集的金币数目 26.private int mCoinCount=0; 27.public int CoinCount { 28.get { 29.return mCoinCount; 30. } 31. } 32.

Unity3D游戏开发之AssetImporter资源导入器

Unity3D游戏开发之AssetImporter资源导入器AssetImporter 资源导入器 Inherits from Object Base class from which asset importers for specific asset types derive. 作为特殊资源类型派生的资源导入器的基类。 Note: This is an editor class. To use it you have to place your script in Assets/Editor inside your project folder. Editor classes are in the UnityEditor namespace so for C# scripts you need to add “using UnityEditor;” at the beginning of the script. 注意:这是一个编辑器类,如果想使用它你需要把它放到工程目录下的Assets/Editor文件夹下。编辑器类在UnityEditor命名空间下。所以当使用C#脚本时,你需要在脚本前面加上“using UnityEditor”引用。文章出处【狗刨学习网】 Variables变量 ?assetPath The path name of the asset for this importer (Read Only) 用于这个导入器,资源的路径名(只读)。 Class Functions类函数 ?GetAtPath Retrieves the asset importer for the asset at path. 为所在路径的资源,导入器重新获取资源。 Inherited members继承成员Inherited Variables继承变量 ?name The name of the object. //物体的名字 ?hideFlags Should the object be hidden, saved with the scene or modifiable by the user? 物体是否被隐藏、保存在场景中或被用户修改? Inherited Functions继承函数 ?GetInstanceID Returns the instance id of the object. 返回物体的实例ID ?ToString Returns the name of the game object. 返回游戏物体的名称。 Inherited Class Functions继承类函数 operator bool

相关主题