admin管理员组

文章数量:1547926

文章目录

  • 前言
    • Hot Keys
  • 实例1
    • 实例1.1:Hello Cube
      • 发射频率控制:(写在update函数里)
      • Summary
    • 实例1.2:创建小岛
      • 创建地形对象
      • Summary
    • 实例1.3:岗哨
      • 使用“碰撞器”来实现角色与门的互动
      • 使用“光线投射”来实现角色与门的交互
      • 使用“触发器”来实现角色与门的互动
      • Summary
    • 实例1.4:收集、物品栏和 HUD
      • 子弹PowerCell的制作及其收集
      • Hud的制作
      • 红灯转绿灯
      • 字体
      • Summary
    • 实例1.5:实例化和刚体
      • 实例化Coconut
      • 装着标靶的屋子CoconutShy
      • 标靶
      • CrossHair瞄准
      • Summary
    • 实例1.6:粒子系统
      • Campfire
      • FireSystem
      • Smoke System
      • Matches.cs
      • Summary
    • 实例1.7:制作菜单
      • Summary
    • 实例1.8:动画基础
      • Summary
  • 实例2
    • 实例2.1
    • 实例2.2
      • Summary

前言

安装4.6.8教程

Hot Keys

热键 作用
ctrl+shift+n 创建新物体
fn+f2 重命名物体
Q Pan 平移
W Move 移动
E Rotate 旋转
R Scale 缩放
F Focus 聚焦
Ctrl+p Play 运行游戏/退出游戏
Ctrl+d Duplicate 复制对象
delete 删除

实例1

实例1.1:Hello Cube

  • Unity 游戏对象消失 enable,destroy与active的区别

  • Unity中Update和FixedUpdate的区别

  • Unity协程(一):彻底了解yield return null 和 yield return new WaitForSeconds

  • Update和LateUpdate的区别

  • Unity 4种光源:平行光、点光源、聚光灯、区域光

  • 物体移动的方式:Unity3d 控制物体transform移动的几种方法、Unity中的物体移动-Transform.Translate

  • 碰撞体、刚体:传送门1、传送门2;预制体

  • GetButton 和 GetKey:GetKey会使用KeyCode明确指示按键名称

    • 没有按下按键时:GetButtonDownFalseGetButtonFalseGetButtonUpFalse

    • 按下按键时,第一帧返回true:GetButtonDownTrueGetButtonTrueGetButtonUpFalse

    • 按住(hold down)按键时:GetButtonDownFalseGetButtonTrueGetButtonUpFalse

    • 松开按键时:GetButtonDownFalseGetButtonFalseGetButtonUpTrue

      总结: GetKey的行为与其完全相同,只是代码写法略有不同。

    bool down = Input.GetButtonDown("Jump");	
    bool down = Input.GetKeyDown(KeyCode.Space);
    

    打开Edit - > Project Setting - > Input,即可查看Positive Button(激活按钮)

  • Instantiate vs Instantiate as RigidBody:Instantiate返回的是一个Object,Instantiate as是将其转变为一个刚体再返回。

Instantiate returns an Object. That's not hugely useful. So the second example casts the result as a gameobject and then assigns it to the "projectile" variable so you can do other things with it.
  • transform.TransformDerection:从本地坐标转换为世界坐标

  • Object.Destroy:public static void Destroy(Object obj, float t = 0.0F); t是延迟销毁的时间

  • Edit - > Project Setting - > Input - > Vertical - > Type:MouseMovement 鼠标移动;Key or Mouse Button 鼠标或按键

  • Time.time:自游戏开始以来的时间(以秒为单位)

发射频率控制:(写在update函数里)

解释:Update函数(每帧调用一次更新)是每过一个Time.deltaTime就运行一次的。假设Time.deltaTime等于0.1秒,频率为每0.5秒/次(即firerate=2)。那么当Time.deltaTime=0.6s时,nextFireTime=0.5。假设Time.deltaTime等于0.4秒时,此时nextfireTime等于0s。

当按下开火键时,nextfireTime等于0.5秒。此时子弹实例化,更新nextFireTime为1.0秒,这个时候就起到了一个限制频率的作用。下一次开火的时间为前一次开火的时间加上限制子弹发射的时间间隔,如果下一次开火的时间大于当前的时间,则子弹无法实例化。那么下一次运行Update函数时,nextFireTime为1.0秒,只有当Time.time为1.6秒时才可以将nextFireTime更新为1.5s。

总结 Time.time想象成一个在时间轴上不停向前运动的物体A,它的位置不受任何东西影响。我们的频率限制是每t秒只能开火一次,且A的位置要在B的位置之前才能开火。想象每t秒有一个障碍物,每当B穿过障碍物且按下开火键的时候,就会触发发射子弹的功能。当A越过障碍物,B的位置改成前一帧A的位置。此时按下开火键,发射子弹,B的位置向前增加t秒,此时,只有A追上B的时候,才能开火。当A追上B的时候,B的位置再次更改为A前一帧B的位置,循环往复。(注意,帧率是变动的,也就是说Time.deltaTime是在动态变化的,这里为了方便解释,将其假设为定值。)

if (Time.time - 1f / fireRate > nextFireTime) 
  nextFireTime = Time.time - Time.deltaTime;
  		
 while (Input.GetButtonUp("Fire1") && (nextFireTime < Time.time)) {
  nextFireTime += 1 / fireRate;
  Rigidbody instance = Instantiate (bullet, this.transform.position, this.transform.rotation) as Rigidbody;
  Vector3 forword = this.transform.TransformDirection (Vector3.forward);
  instance.AddForce (forword * power);
  Debug.Log ("Fire!");	
}

Summary

公式 作用
Input.GetAxis("Horizontal") 获取物体在水平方向 向左还是右运动
Input.GetAxis("Vertical") 获取纵轴在垂直方向 向上还是向下运动
Time.deltaTime 获取提当前帧和上一帧之间的时间间隔
transform.Translate(h,0,v) 设置下一步移动的矢量方向和大小进行移动
Input.GetButtonUp ("Fire1") 按下fire1(左ctrl键)
Instantiate (object,position,rotation) as Rigidbody 实例化为刚体
this.transform.TransformDirection (Vector3.forward) 从本地坐标转换为世界坐标
instance.AddForce (forward * power) 给物体施加力
Destroy (this.gameObject,3f) 3s后销毁该物体

实例1.2:创建小岛

创建地形对象

  • Create - > 3D Object - > Terrain

  • 在Inspector视图中,找到Terrian(Script)组件

    第一个图标:Raise/Lower Terrian 手动升高或降低地形,从调色板中选择一个画笔,然后单击鼠标并将其拖动到Terrain对象上以提高其高度。在按住Shift键的同时单击并拖动以降低地形高度。

    第二个图标:Paint Height 第一个按钮从左侧激活“ *升高/降低高度”*工具。使用此工具绘画时,将鼠标移到地形上时高度会增加。如果将鼠标放在一个位置,高度会累积,类似于图像编辑器中喷枪工具的效果。如果按住Shift键,则高度会降低。不同的画笔可用于创建各种效果。例如,您可以通过使用软边刷子增加高度来创建起伏的丘陵,然后通过用硬边刷子降低高度来切割陡峭的悬崖和山谷。

    第三个图标:Smooth Height 平滑地增加高度

    第四个图标:Paint Texture 添加纹理

    第五个图标:Place Trees 种树

    第六个图标: Paint Details:Hold down shift to erase,hold down ctrl to erase the selected detail type

    第七个图标:Terrian Settings

  • 第二个图标,Height 设置为30。并按Flatten。

    左边第二个工具是绘制高度 (paint height)工具,该工具使您能够指定目标高度,并将地形的任意部分移向该高度。一旦达到目标高度,地形便会停止移动并保持在此高度。

    unity 还提供可使地形变平的简便方法。选择地形 (terrain) -> 变平… (flatten…)。该功能使您能够将地形变平至您在向导中指定的高度。地形高度调节、地形引擎

  • 第一个图标,Brush Size=100,Opacity=75,刷出形状

  • 第二个图标,Brush Size=75,Opac-ity=50,Height=100;鼠标点击数次,形成火山

  • 第二个图标,Brush Size=30,Height=20;鼠标点击数次,形成火山口

  • 选择Import Package- > Terrain Assets

  • 选中Terrain对象,第四个图标Paint Texture,找到Textures,点击Edit Textures,在弹出的菜单中选择Add Texture,将弹出一个对话框,点击Texture - > Select,选中Grass(Hill),点击Add退出对话框,此时Terrain对象应该被Grass(Hill)纹理覆盖了

  • 添加三种纹理,Grass & Rock、GoodDirt、Cliff(LayeredRock),并修改最后一种纹理的Tile Size的属性:x=70,y=70

  • 点击GoodDirt,修改属性:BrushSize=60,Opacity=50,Target Strength=1,刷地形海岸部分

  • 点击Grass&Rock,Brush Size=25,Opacity=30,Target Strength=0.5,对小岛的丘陵地带和火山的上半部分进行粉刷

  • 点击 Cliff,Brush Size=20,Opacity=100,Target Strength=1,对火山外围的上半部分和整个内围进行粉刷

  • 第五个图标,然后在下方点击EditTrees,选择Add Tree,在弹出的对话框中,点击Tree最右边的圆形选择按钮,这将打开对话框SelectGameObject,然后选择Palm,接着点击Add

  • 修改属性:Brush Size=15,Tree Density=40,ColorVariation=0.4,Tree Height=50,Variation=30,Tree Width=50,Variation=30;

  • 在小岛上的沿岸地带和内部随机放置一些Palm,要移除放置了的Palm,可以按住Shift键,再点击Palm

  • 第六个图标,然后在下方点击EditDetails,选择Add Grass Texture,在弹出的对话框中,点击Detail Texture右端的圆形选择按钮,在弹出的Select Texture2D对话框中,选择Grass纹理后,确保Billboard被选中,点击Healthy Color最右端的笔形图标,然后在小岛内部的草地上点击一下,使两者颜色一致,最后点击Add;

  • 第六个图标,修改属性:Brush Size=100,Opacity=0.1,TargetStrength=0.3,点击,粉刷

  • Import Package-Character Controller,在弹出的对话框中,点击Import,将导入角色控制包

  • Assets-Standard Assets-CharacterControllers,然后将右侧窗口中的First Person Controller预制体拖入场景中;

Summary

  • 添加阳光: 在Project视图中,鼠标左键点击左侧的Assets,然后在右侧的Assets中,鼠标右键点击,然后选择Import Package-Light Flares,点击Import,导入镜头光晕包; 选中Directional light对象,在Inspector视图中,找到Light-Flare属性,单击最右端的圆形选择按钮,在弹出的对话框中,选择Sun,这将添加一个太阳光晕

  • 添加天空盒: 鼠标左键点击左侧的Assets,然后在右侧的Assets中,鼠标右键点击,然后选择Import Package-Skyboxes,点击Import,将导入天空包

  • 添加水: 在Project视图中,鼠标左键点击左侧的Assets,然后在右侧的Assets中,鼠标右键点击,然后选择Import Package-Water(Pro Only),点击Import,导入水资源包;将Daylight Water拖入场景中,并Reset它的Transform组件,并修改属性Transform-Scale:X=1600,Z=1600,然后在Scene视图中,点击该对象上的绿色坐标Y轴,上下提升,使得海水刚好淹没小岛的海岸线为止;

实例1.3:岗哨

  • 在Inspector视图中,修改属性Meshes-Scale Factor=1.5,勾选选中属性Meshes-Generate Colliders,勾选选中属性Meshes-Generate Lightmap UVs,点击Apply;

  • 确保 outPost-door 对象被选中,在 Inspector 视图中,点击 Add Component - Physics-Rigidbody,添加刚体,勾选去掉 Use Gravity 属性,勾选选中 Is Kinematic 属性,这样 Unity 引擎就不会对门使用物理效果了;

  • 确保 outPost-door 对象被选中,在 Inspector 视图中,点击 Add Component - Audio-Audio Source,勾选去掉它的属性 Play On Awake;在 Hierarchy 视图中,点击 outPost 对象,在 Inspector 视图中,找到属性 Animation-Play Automatically,勾选去掉它,这样就不会自动播放动画了;

  • 通过子对象获取父对象:sonObject.transform.parent

  • OnControllerColliderHit:OnControllerColliderHit is called when the controller hits a collider while performing a Move.

    This can be used to push objects when they collide with the character.

  • OnTrrigerEnter与OnCollisionEnter、OnControllerColliderHit、Rigidbody、CharacterController

  • OnTriggerEnter 和 OnCollisionEnter

使用“碰撞器”来实现角色与门的互动

  • 三秒后,自动关门
	void Update () {
		if (doorIsOpen) {
			doorTimer+=Time.deltaTime;
			if(doorTimer>doorOpenTime){
				Door(currentDoor);
				doorTimer=0f;
			}
			
		}
	}
  • 碰撞到门,

    本文标签: 学习笔记版本Unity