场景是由游戏物体组成的,游戏物体是由组件组成的,
场景是由游戏物体组成的,游戏物体是由组件组成的,
破解下载链接:http://www.ceeger.com/forum/read.php?tid=23396
左上角componet里有各种组件
折叠inspector面板里的各component可能导致显示上有影响
component方框打勾(类似CAD
Gizmos 缩放相机图标
左上角那5个按键对应QWERT
control s 保存场景
control n 新建场景 或左上角file
场景(scene)位于assets文件夹,可以新建一个scenes文件夹方便管理。新建场景后可以在project面板找到。
父类动子类动
子类动父类不动
1.创建墙:先创建cube Ctrl+d 复制一份副本
修改坐标轴x=1 按住Ctrl键移动
2.物理引擎 添加:在cube的AddComponent 添加Rigidbody
3.制作预制体 Create Folder (Prefabs),把上面制作的cube拖到文件夹就可以制作
控制相机移动:
代码:float h = Input.GetAxis("Horizontal");
测试: Debug.Log(h);
transform.Translate(new Vector(h,0,0)*Time.deltaTime); // 时间间隔
方向键右键:h=1;
方向键键:h=1;
start开始 初始化
Update更新 帧数越高越频繁
在实例化子弹时(未添加相机的坐标跟旋转),没在游戏视野内观察到球体。后面添加后,能够看到将相机实例化成了子弹球体。
预制体实例化
1.创建Main场景
2.创建地面
2.1 GameObject -3D- Plane
2.2 使用cube
游戏物体
1.物体间父子关系
2.物体由组件组成
2.1信息组件
2.2功能组件
local 局部坐标
global 世界坐标
常用
双击-聚焦
右键-旋转视野
中键-平移视野
透视-正交视野,含义、切换
Box Collider 碰撞组件
Mesh Renderer 显示组件
Scene - GameObject游戏物体 - 组件Component(Transform组件,位置旋转缩放属性)
控制相机的运动较合适的是通过键盘的上下左右来控制相机的上下左右。
依次点击“Edit”-“Project Settings”-“Input”,Inspector窗口会显示“InputManager”组件,它管理着输入的相关属性,其中:
Horizontal的Negative Button(负向按钮)是“left”,Alt Negative Button(备选的负向按钮)是“a”;
Horizontal的Positive Button(正向按钮)是“right”,ALT Positive Button(备选的正向按钮)是“d”;
Vertical的Negative Button(负向按钮)是“down”,ALT Negative Button(备选的负向按钮)是“s”;
Vertical的Positive Button(正向按钮)是“up”,ALT Positive Button(备选的正向按钮)是“w”。
利用这些预设好的按键绑定,可以方便控制相机的移动:
先得到键盘的输入信息
Input.GetAxis("Horizontal");
Input.GetAxis("Vertical");
再控制相机移动
transform.Translate(new Vector3(h,v,0));
SIKI老师说“Input.GetAxis("Horizontal");”返回一个Float类型的值,所以可以在这段代码面前定义一个float类型的“h”,这是一种简化方式。
所以:
void Update ()
{
float h =Input.GetAxis("Horizontal");
float v =Input.GetAxis("Vertical");
transform.Translate(new Vector3(h,v,0));
}
现在有个问题,就是相机移动得太快了。为什么呢?Input.GetAxis("Horizontal")的返回值不是-1到1吗?
的确,Input.GetAxis("Horizontal")的返回值(赋值给了h和v)是-1到1,但是这些代码是在Update里面执行的,Update的作用是使代码每帧执行一次,那么在60帧的游戏中,1秒里代码就被执行了约60次,也就是相机的速度是每秒约60米。
解决办法:
最简单的,就是乘上1/60,也就是约0.017:
transform.Translate(new Vector3(h,v,0):0.017);
但是,游戏帧数是不稳定的,与计算机性能有关,这个解决办法不完美。
另外的办法是使用Time.deltaTime(当前帧的时间间隔):
假设当前帧的时间间隔是t,游戏中的帧数是f,那么t=1/f秒。
无论帧数是多少,在Update方法中,h和v乘上t,还会是-1到1的值,这样相机移动速度更符合现实世界,操作更有手感。
这其实是一种游戏优化。
实例化出来的子弹需要撞击砖块,就要有一个速度,那么给子弹添加一个具有物理效果的组件“Rigidbody(刚体)”,这样就可以通过Rigidbody组件给子弹施加力,从而具有速度,具备撞击砖块的能力。
给子弹添加力:先获取Rigidbody(刚体)组件,再利用它给子弹施加力。
1.声明
在C#中,变量的声明格式为:
数据类型 变量名;
变量的赋值格式为:
变量名 = 数据;
就像“public float speed;”中,speed是浮点数的代表,声明“rigidbody”来代表Rigidbody组件:
Rigidbody rigidbody;
2.获取组件
声明了“rigidbody”是刚体组件的代表后,还需要访问刚体组件才可以调用相关数据:
rigidbody=GetComponent<Rigidbody>();
意为“rigidbody”访问了“Rigidbody”组件,有权使用相关数据了。
上面两个代码可以简化为:
Rigidbody rigidbody = GetComponent<Rigidbody>();
但是要注意,当前“发射子弹”脚本是挂载在相机下面,是相机的组件,“GetComponent<Rigidbody>”访问的是相机的刚体,明显不对,应该访问实例的刚体组件。
怎么访问实例的刚体组件呢?
首先要明白的是:
“rigidbody=GetComponent<Rigidbody>;”是“rigidbody=This.GetComponent<Rigidbody>;”的简化版,“this”被略写。
这是什么意思呢?就是“This”脚本所在物体,代表的是相机。所以把“this”换成代表实例的不就可以了?
所以声明一个代表实例的变量名,再用刚体组件的代表访问实例的刚体组件,进而控制实例:
GameObject 实例;
由于实例“Instantiate”会返回返回实例化的克隆,所以:
实例=GameObject.Instantiate(子弹,transform.position,transform.rotation);
上面两个代码可以简化为:
GameObject 实例 = GameObject.Instantiate(子弹,transform.position,transform.rotation);----A
意为:实例化一个实例后,用“实例”代表实例物体。
所以此时相机里的脚本可以访问实例的组件了:
把“this”变为“实例”:
Rigidbody rigidbody = this.GetComponent<Rigidbody>;
↓↓
Rigidbody rigidbody = 实例.GetComponent<Rigidbody>;--------------------------------------B
至此,访问完成。
完成后的代码如下(A+B):
GameObject 实例 = GameObject.Instantiate(子弹,transform.position,transform.rotation);
Rigidbody rigidbody = 实例.GetComponent<Rigidbody>;
(写了好长,当初看SIKI老师的教学视频对这里是一知半解,现在加上自己的理解,算是搞明白了逻辑。我总结到的学习方法是初略先过一遍教学视频,再精学,详细记录笔记。)
3.施加力:
这里学习一个新的方法:velocity(速度)(Unity文档:刚体的速度矢量)。
还学习一个:transform.forward(Unity文档:操纵GameObject在世界空间中变换的Z轴(蓝轴)上的位置。与Vector3.forward不同,Transform.forward在考虑其旋转的同时移动GameObject。)
所以总的代码就是:
public GameObject 子弹;
public float speed=30;
void Updatte()
{
if(Input.GetMouseButtonDown(0))
{
GameObject 实例 = GameObject.Instantiate(子弹,transform.position,transform.rotation);
Rigidbody rigidbody = 实例.GetComponent<Rigidbody>();
rigidbody.velocity = transform.forward*speed;
}
}