赞
踩
导语
由于课设的原因,这个寒假和隔壁班三个同学一起做小游戏,师兄介绍了这款引擎。本人负责怪物的属性设定、行为逻辑和相关接口的构建。总共5天时间,边学边做,引擎和C#都是从未接触过的。目前熟悉了搭建游戏比较基础的知识,过程中也遇到了一些比较迷的问题。在此做一下记录和总结。
1 父子物体 管理多个子物体,改变物体操作的中心点/pivot的位置 ———————————————————————————————————————————————————————— 2 预制体 Prefab 预先加入的物体,预备之后重复使用 与非预制体的差别 预制体 非预制体 物体颜色 蓝色 白色 Inspector颜色 三面蓝色 红绿蓝 Inspector控制板 Apply 改变一个模型 其他可以一起改变 Select 点击以后 快速在文件夹中做出定位 Revert 修改 删除添加 部分脱离预制体关系 Apply 重新回归预制体关系 ———————————————————————————————————————————————————————— 3 摄像机 Camera 展示当前视角 控制 Hierarchy 出现Scene预览 GameObject Align With View快速定位当前摄像机的观察角度 属性 1Clear Flags清楚标记 SkyBox 天空背景 Solid Color 纯色背景 2BackGround背景 SolidColor 调整背景纯颜色 3Projection投影 Perspective 透视模式。近大远小 Orthographic 正交模式。适合2D,远近一样大 4Clipping Planes切割面,设置摄像机观察范围 Near 相对于相机的近平面 Far 相对于相机的远平面 ———————————————————————————————————————————————————————— 4 灯光 Light
|----Assets:资源文件夹,保存游戏中所有的资源。
| Assets中的资源类型 | 含义 |
| Prefabs | 预制体 |
| Scenes | 场景 |
| Textures | 贴图 |
| Scripts | 脚本 |
| Resources | 资源 |
|----Library:库文件夹,保存当前项目需要的库文件。
|----ProjectSettings:项目设置文件夹,保存项目的设置信息。
|----Temp:临时文件夹,保存项目的临时数据。
属性
position 位置
函数
Translate(Vector3,Space)
Rotate(Vector3,float)
GetComponent<T>() 有许多中,如果是components的话就便利获得即可
AddComponent<T>()
SetParent(Transform) 给物体设置一个父物体
属性 Mass 质量 单位KG Drag 阻力 单位N Angular Drag 角阻力 扭矩力的空气阻力,越小阻力越小,越会转 Use Gravity 是否使用重力 Is Kinematic 运动学上的 保持个体平衡 函数 MovePosition([CurrentPosition]+Vector3); AddForce 作用 给刚体添加一个力,让刚体按“世界坐标系”来进行运动 代码 Rigidbody.AddForce(Vector3, ForceMode); 参数 力的方向和大小 ForceMode Acceleration加速度 Force正常的物理力 Impulse冲击力,瞬间发生 VelocityForce带有速度的力 AddRelativeForce 作用 给刚体添加力,刚体按“自身坐标系”来进行运动 代码 Rigidbody.AddRelativeForce(Vector3,ForceMode); 参数 力的方向和大小 问题 若球体在Update中使用此方法,可能存在来回摆动的现象??因为方向随着旋转变化
碰撞时 What 当一个用刚体控制的物体与另一物体碰撞时,出发的事件 How 目标物体必须带有Collider组件。碰撞Collision 函数 void函数 OnCollisionEnter(Collision) 当碰撞开始时调用 void函数 OnCollisionExit(Collision) 当碰撞结束时调用 void函数 OnCollisionStay(Collision) 当碰撞结束时调用 类 Class Collision 传递碰撞信息,可获得碰撞所属的物体 碰撞体勾选Is Trigger成为触发器 定义 碰撞体勾选为Trigger后,此碰撞体可以被穿透,且碰撞事件无法发生 作用 当进入触发器范围内,将触发相应行为。不用发生直接碰撞 方法 void OnTriggerEnter(Collider); 当进入触发范围时开始调用 void OnTriggerExit(Collider); 当离开触发范围时开始调用 void OnTriggerStay(Collider); 当处于触发范围内持续调用
碰撞体 | 刚体 | -> | 碰撞体 | 刚体 | 效果 |
---|---|---|---|---|---|
√ | √ | 直接穿透目标物体 | |||
√ | √ | √ | 直接和目标物体碰撞,但是撞不动 | ||
√ | √ | √ | √ | 直接和目标物体碰撞,且能把目标物体撞倒 | |
√ | 穿透,没有碰撞体作用? | ||||
√ | √ | ||||
√ | √ | 无法移动,因为已经掉下地面 |
Cast Shadows 投射阴影 ON/OFF
Receive Shadows 其他的模型是否能投上阴影 ON/OFF
Material object的外观素材 Element
定义 用户操作
开发途径 NGUI,UGUI,OnGUI(引擎界面扩展),LegacyGUI
简介 主要用于文字的显示,在game面板测试
创建 Component->Rendering->GUItext
属性
Text->显示文字
Front Size->文字的大小(单位像素pixel)
PixelOffset->文字偏移量2D
Color
简介 用于图片的显示
创建 通过空物体同GUITEXT进行创建
属性
Texture->纹理
Color->会改变色调
PixelInset->像素设置,xy是图像位置,wh图像长宽
简介
Input下的是全局时间,若挂载到某一个游戏物体身上,只有鼠标操作该物体时才会发生对应的事件
常用方法
OnMouseEnter();OnMouseExit();OnMouseDown();
进入,退出,单击。
管理所有UI页面
Start页面
内容 游戏名称 游戏简介 游戏开始按钮
组成 父物体管理整体 字父物体管理 图父物体管理
Stay页面
内容 分数 时间 等运行时内容
组成 父物体管理整体
Stop页面
内容 提示 重新开始按钮
形式
脚本,用于管理整个游戏的流程逻辑
框架编写
1、创建当前游戏状态枚举,Start、Stay、Stop 利用枚举类型enum name{aaa,bbb,ccc};
2、查找获取三组UI的引用,并控制它们的显示次序 通过引用.SetActive(T/F);来使得UI页面隐藏或可见
3、定义一个字段,存储当前的游戏状态
4、定义一个切换游戏状态的方法 Public
Awake();
Start();
名称 刚开始的行为
作用 每次开始运行后马上进行的行为,执行一次
Update();
名称 每一帧更新方法
作用 画面每渲染一次就是一帧,每帧的时间不固定
缺点 若执行物理行为,则会卡顿
FixedUpdate();
名称 固定更新方法
作用 所有和物理相关的操作,代码都要写在此方法中
参数 固定更新时间Edit->Project Settings->Time
OnCollisionEnter(Collision);
OnCollisionStay(Collision);
OnCollisionExit(Collision);
OnTriggerEnter(Collider);
OnTriggerStay(Collider);
OnTriggerExit(Collider);
OnParticleCollision(GameObject);
OnMouseEnter();
OnMouseExit();
OnMouseDown();
Invoke(obj,startTime);
InvokeRepeating(obj,startTime,restTime);
isInvoking(); Return Bool ;
CancelInvoke();
属性:黑透白不透
---------------------------------------------------------- Input 键盘 GetKey(KeyCode); GetKeyDown(KeyCode); GetKeyUp(KeyCode); 鼠标 GetMouseButton(int); GetMouseButtonDown(int); GetMouseButtonUp(int); ---------------------------------------------------------- GameObject 实例 GetComponent<T>(); 获取游戏物体某个组件 SendMessage(string); 去执行该go身上的脚本文件中的制定方法执行 若要调用其他go脚本中的函数,那个函数为public GetComponent<script>().function(paras); 通过获取脚本组件来执行函数。好处是可有参数 类 Find,FindWithTag… 通过名字或tag获取某个GO Instantiate(go,position,quaternion); 在某个位置,旋转多少实例化一个物体 Destory(go,delayTime); 在delayTime后销毁这个物体 ---------------------------------------------------------- Random 类 Range(minInt,maxInt); 在某个范围内随机生成数 ---------------------------------------------------------- Resources 类 Load(prefabsName[string])as GameObject; 加载Resources文件夹中的预制体 ---------------------------------------------------------- Vector3 类 New Vector3(x,y,z); 新建一个vector3实例 RotateTowards(vector3,v3,speed,xxxx) 操作 minus 计算两个方向之间的vector差 属性 Vector3.forward,up 世界方向的前方、上方 ---------------------------------------------------------- Int 类 Parse(string); 将string类型的数字转成int类型 实例 .ToString(int); 将int类型的数字转成string类型 ---------------------------------------------------------- Color 类 New Color RGB都在0~1内
What? 从一个点往一个方向,发射一根无限长的射线,这根射线与场景中的其余的游戏物体的碰撞体组件相碰撞,射线即结束. Why? 因为射线可以与物理组件Collider相交互,所以"射线"也被称为"物理射线". Where? 攻击使用的技能 How? 通过摄像机创建射线 思路:由发射射线的实例物体A向屏幕上某一位置的点P发射一条射线,获得一条A与P先关的ray实例 go Camera.main 引用 tag被设置为"MainCamera"的摄像机的引用 Ray go.ScreenPointToRay(Vector3)把屏幕点转化为射线 Input.mousePosition 鼠标所在的位置值 Ray 结构体 检查射线与其他物体的碰撞 思路:由Physics的静态类Raycast来检测与ray相关的碰撞bool,同时得RaycaseHit结构体存储碰撞信息 RaycaseHit 结构体 用于存储射线的碰撞信息 bool Physics.Raycast(Ray,out RaycastHit) 静态函数 检测Ray对象,一旦有碰撞则返回真 并把碰撞信息存在RaycastHit raycastHit->collider.gameobject 实例 通过碰撞信息相关的碰撞体找到其所属的go Collider 【组件】 与A发生碰撞的物体身上的碰撞盒,可间接获取gameobject Point 【Vector3】 发生碰撞的位置 Debug? Debug.DrawRay(vector3,vector3,color); 起点位置,终点-起点的方向,颜色 Debug.DrawLine(vector3,vector3,color);
作用
体现物体运动速度快
创建
Component->Effects->TrailRenderer
Materials 设置透明材质球。多条线
属性
Time->拖尾的消失时间
StartWidth->开始的宽度
EndWidth->结束的宽度
Color->渲染多色
举例
成为展示物体的子物体
作用
激光
创建
Component->Effects->LineRenderer
属性
Position->设置线的开始点和结束点
StartWidth->开始宽度
EndWidth->结束宽度
StartColor->开始颜色
EndColor->结束颜色
实例函数
SetPosition(int index,vector3 position);
设置该材质球的Shader为Particle/Additive(例子/添加物)
再添加素材
多个子物体组在一起,碰撞盒有交叉部分
动态AddComponent<RigidBody>来产生碰撞散列效果
资源 AudioClip音频剪辑 格式 Aif,wav,mp3,ogg 文件 Audios 作用 播放音频资源的组件 创建 Component->Audio->AudioSource 属性 AudioClip->制定播放文件 PlayOnAwake->游戏一开始运行就执行 Loop->是否循环播放T/F Mute->是否静音T/F Volumn->音量0-1 SpatialBlend->空间混合0为2D声音,1为3D 函数 Play();Stop();Pause();实例的直接函数
作用
只有有这个组件,我们才可以听到声音(在摄像机身上)
定义 协程,协同程序。使得顺序执行的两个行为并行 前提 继承MonoBehaviour 形式 IEnumerator Func(){ Yield return new WaitForSeconds(2); 代码片段; } 说明 Ienumerator->协同程序的返回值类型 yield return->协同程序返回 new WaitForSeconds(s)->实例化一个对象,等待s秒后继续执行; 执行 StartCoroutine("funcname"); 终止 StopCoroutine("funcname");
意义 所挂载的游戏物体的声明周期 前提 继承MonoBehaviour Awake() 唤醒,在整个游戏中只执行一次。即使脚本此时并没有执行,此函数也在底层执行了 OnEnable() 启用,之执行一次。当脚本组件被启用的时候执行一次,即启用脚本 Start() 开始,只执行一次。开始运行脚本 LateUpdate() 在Update每次执行后跟着执行,但是这个方法好像在Start执行后先执行了一次 OnGUI() 渲染GUI系统一般是Update的两倍执行次数 FixedUpdate() 0.02s执行一次,固定更新时间,所有物理组件相关的更新在此执行 Update() 更新,执行N次,每帧执行一次 OnDisable() 在OnDestroy()执行前执行,脚本的禁用事件 OnDestroy() 销毁
Screen 作用 包含屏幕相关信息 常用属性 Screen.width,Screen.height只读属性 Time 作用 包含与时间相关的信息 属性 Time.time 静态只读,从游戏开始到现在所经过的秒数 Time.deltaTime 静态只读,是渲染完上一帧的时间。倒计时 Time.timeScale 静态属性,时间缩放。可以用于暂停游戏。1:正常,0.5:慢放倍数,0暂停。 是deltaTime的缩放情况 Mathf 类型 结构体 常用函数 绝对值,最大值、最小值,四舍五入round 插值运算函数 Mathf.Lerp(float a, float b, float t);在a和b间相隔t A = Mathf.Lerp(A,10,Time.deltaTime);保存插值,实时更新
1、静态成员变量
被所有实例所共有。当一个实例修改了其值,其他实例在用的时候也是用这个新修改的值
2、error:Cannot modify a value type return value of '…'. Consider storing the value in a temporary variable.
问题原因:部分具体的变量无法直接修改
解决方案:如要修改Color col 中的col.r,则先Color temp = col,临时修改temp.r,再将temp赋值给col这个整体
总结:即小项无法修改时,直接用修改过的大项来进行整体覆盖
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。