collision.conllider 获取碰撞对象信息
发生碰撞——至少有一个物体有刚体属性
collision.conllider 获取碰撞对象信息
发生碰撞——至少有一个物体有刚体属性
OnCollisionEnter 开始碰撞
OnCollisionExit 结束碰撞
OnCollisionStay 碰撞中
1.prefab:预制体,在Assets下创建该文件夹,将 物体拖拽至该文件夹
2.reset:回到了默认状态,不会回到预制体状 态,可以把原来的删除,直接重新拖一个 预制体即可
3.当把Main Camera设置成预制体又删掉预制体,上面面板Main Canera会出现表示,取消标识:Break prefab instance,与预制体脱离关系
Enemy 敌人
prefab
1.在Animation文件夹中建立一个动画状态机——在文件夹中右击点击Animation Controller,命名heroController;并把动画状态机赋值给角色当中的animator中的Contorller;
2.编辑动画状态机
选择相应的角色,在window下面有一个animator,可以将animator编辑窗口放到视窗的下面。
3.添加动画
首先添加默认动画,在Project中Animations文件夹中,将默认动画拖入场景中,动画的标志时有点像播放的按钮。
4.状态切换
将Walk动画和Run动画都拖入编辑动画状态机中,然后在Animator左侧面板中,点击parameter一栏,点击加号的图标,添加一个float的变量。回到动画窗口中,按一定逻辑关系一次链接动画,并点击连线出添加条件。
5.在程序中实时更新float speed的值
public animator anim ;
void Update();
anim.SetFloat(“Speed”,agent.Velocity.Magnitude);
1.移动摄像机,与角色保持一定距离,设置好视角。
2.创建一个脚本,命名为FollowTarget。
3.编辑代码
添加变量:
Public Transform hero;
Private Vector3 offset;
在void Start()
offset=transform.position - hero.position; //offset 是角色和摄像机的差距。
在void Update()
Transform.position = offset+Hero.position;
通过Nav Mesh Agent 组件,控制角色的移动,通过鼠标点击移动,
1.建立脚本,并赋值给角色。
2.射线检测
判断鼠标是否按下(在Update函数中)
If(Input》GetMouseButtonDown(0)) //其中0代表鼠标左键的按下。
Using UnityEngine.AI
Public NavMeshAgent agent;//在hero的inspector面板中,将Nav Mesh Agent 组件 添加Script的agent当中(通过拖拉),注意在vs中NavMeshAgent在Unity Engine.Ai的命名空间中。
{ Ray ray = Camera.main.ScreenPointToRay(Input.MousePosition);
RayCastHit Hit;
If(Physics.RayCast(ray,out hit))
{
agent.SetDestination(hit.point);
}
}
3.发现角色在移动转角时,速度比较慢,可以在inspector中的Nav Mesh Agent 中有一个Angular Speed可以设置大一点。
火光闪烁=Window-Animation 动画效果
1.导航网格烘培
在Window菜单栏下,选择导航系统。在Inspector面板下,确定Env(包括里面的树、石头、火堆,是为了后面电脑计算角色,避开各种障碍,以最优方式达到目的地)下的所有物体的Static中的NavigationStatic是勾选上的,一般Static勾选上后,里面的NavigationStatic也是勾选上的。
2.生成导航网格在Navigation面板下的Bake(烘培),在面板中,点击Bake按钮进行烘培。
3.烘培后,蓝色部分为可行走的区域,但是问题是,非行走区域面积计算不准确,比障碍面积要大很多。这时可以更改AgentRadius改小一点。这样可以增加可行走区域。
4.怎么可以让场景中的草可以穿过去,把草所在区域变为可行走区域,(选择场景中的草,在Inspector面板中,选择Static的下拉按钮,选择取消勾选NavigationStatic,回到Navigation面板中,重新烘培),即可不把草当成阻碍物。
5.在石头上方也有可行区域
取消石头上方的可行走区域,选中石头(一定是石头的静态网格),在Navigation面板下,Object一栏中,有一个NavigationArea的选项,设置为NotWalkable即可,重新烘培。
6.添加导航网格(让角色在导航网格上行走),
选择角色,在Inspector面板中AddComponent——选择Nav Mesh Agent(代理人),添加后会生成一个圆柱体的线框,保证圆柱体大小高度与角色保持一致——设置Radius和Height参数。
1.为灯光添加动画
在SampleScene面板中,选择要添加动画的灯光,在菜单栏中的window下,有个animation,点击弹出一个对话框,点击create,选择保存的位置,保存在asset面的animation中,取名为flicker,创建好后,在animation的文件夹中会出现flicker的动画和Pointlight的状态机。(注意如果动画的窗口关闭后,要从新打开这个动画编辑器窗口,这时需要选中这个游戏物体,比如刚才在灯光下添加动画,选中的时灯光这个游戏物体,然后在window中点击animation,即可打开这个动画)
2AddProperty(添加属性)
Intensity(强度),在不同的帧数前,设置不同的灯光强度大小。
3.在播放下下面有个Samples,数值越大,播放的速度越慢,相当于播放率(Play Rate)。
地形工具
1.火堆上的灯光不对,调节灯光即可,但其他灯光并没有改变,所以在调节好灯光的位置时,这时需要在灯光的inspector面板中,点击apply(应用),其他灯光即可统一位置。
灯光图标大小调节:在Scene窗口中Gizmos下拉按钮,在弹出来的列表中,第一个3DIcons(3d图标),可以调节图标大小。
注意:在调节好灯光后,并且Apply后,其他灯光也发生改变,但从顶视图上看时,会发现,在应用后,在Top视角看,其他灯光的位置偏离原位置,这是一种视觉的效果,他的位置还是位于火盆的正上方。
2.创建粒子效果
在火盆下创建一个粒子效果,右击选择Effect,在弹出的界面中选择ParticleSystem。
3.调节参数:
形状:Shape(修改大小Radias)
高度:点击shape后,在场景中,粒子系统周围出现一些点和线,可以通过那些点来改变粒子系统的高度形状大小等。
速度:使用随机速度——在粒子效果速度设置一栏,下拉按钮,设置为范围类随机速度。
生命:
粒子的样子:选择粒子动画,FX
创建粒子材质:在粒子动画下,创建一个粒子动画材质,在Inspector面板,材质的shader设置为particles下的Additive。Texture中,把粒子动画贴图拖入Testure的框中,颜色使用白色。
把材质指定给粒子系统:在粒子系统中有个render,把材质拖入粒子系统下的render下的Material一栏中;这是在Scene窗口中看到的粒子效果并没有播放动画,这时需要粒子系统中有一栏TextureSheetAnimation,把这一项勾选上,下拉,在Tiles(瓷砖)下,设置动画的模式时4*4,即表示是,四行四列的动画。
Tiles:瓷砖数,相当于3dsmax,中的瓷砖数。
播放动画:
动画图样大小:
粒子效果大小:StartSize
粒子数量:Emission中更改为随机大小。
粒子在慢慢变小:SizeOverLifetime
1、灯光参数设置
Inspector面板中,ShadowType(影子类型):可以说设置为HardShadow——阴影比较硬,SoftShowdown——阴影比较柔和。(不然没有效果)
2.整体灯光太亮
把环境灯光范围改小一点,即Range 和intensit(强度)改小一点。
3.注意在右侧面板中Light Setting面板,有一项DebugSetting,下面有两个选项,一个是AutoGenerate(每一次,只要改动灯光参数,或者移动灯光,就会自动进行灯光烘培),GenerateLighting(相当于手动构建灯光);
LightMapping(光照贴图)
光照贴图的烘培
1.window下有个Rendering,弹出的列表中选择LightSetting,并入细节面板,与inspector同排。
2.先选中场景中所有物体,在inspector面板中,勾选右上角的Static,在弹出来的窗口中,选择yes,Charge Children,(改变子对象)。
3.选中要烘培的灯光,在inspector中,Mode选择Baked(烘培,只在烘培时进行计算——realtime 实时进行计算);火光是动态的,所以其灯光使用Mixed烘培。
4.烘培贴图
5、光的3种Mode
realtime:实时计算,
Baked:烘培时计算;
Mixed:实时与烘培时都计算;
1.场景灯光调节
场景灯光不需要太亮,调节太阳的角度和光的强度;
2.添加PointLight,颜色偏紫色。
3.添加火堆——石头,火盆,灯光,粒子效果(后面添加),制作成Prefab.
光源
直射光:直射光的位置对对关照没有影响,但光照的方向会对场景中的物体的阴影产生影响,同样会对天空盒子上的太阳光斑有影响。
2.重置光源
选择太阳光源的角度,可以发现天空盒子上的太阳在慢慢的升起,这是场景里面光线在慢慢变亮,相当于模拟太阳慢慢重水平线升起的感觉。
四种光源:Directional Light(太阳光) Point Light(灯泡光源) Spotlight(手电筒的光) Area Light (在烘培中使用)
1、如何获取碰撞的信息(和那个物体发生碰撞)
print("collision.collider");
collider——获取游戏物体相关的信息(包括下面两个信息);
collider:碰撞器,collider.name——游戏物体的名字;
collider.tag——获取游戏物体的标签;
发生碰撞的条件:1、两个物体必须都有碰撞器()且碰撞器没有被禁止;
2、其中一个物体必须有正常的刚体(即inspector中rigid body中Kinematic(运动)没有被勾选上,勾选上,禁止物体运动);
1.在project一栏中,建立一个文件夹,命名scripts(脚本),在文件夹下创建一个脚本,script,命名为sphere,把script拖到sphere对象的inspector中addcomponent按钮下面空白处就,即可为对象添加script,点击sphere中添加的脚本,在脚本名称处右击,点击script editor,打开vs编辑器;
2.输出日志:在视窗的左下角,点击一下即可打开;
3.程序:
OnCollisionEnter:开始碰撞;
OnCollisionExit;碰撞接触;
OnCollisionStay :撞击在碰撞过程中执行,但不是开始碰撞执行程序,而是开始碰撞后,第二帧执行,知道结束,这个过程中,每一帧都会执行。
Print();输出文本;
1.触发器:选择collider类型,在其中inspector面板中将trigger勾选上。
2.触发函数:OnTriggerEnter——开始触发。
OnTiggerExit——结束触发。
OnTriggerStay——过程触发。
3.获取碰撞信息:
print(“OnCollision”+Other.name);
print("OnCollision"+Other.tag);\
其中other代表其他物体,other.name——获取其他物体的名字。