Roll Ball 案例(其二)
上一小节的链接:Roll Ball 案例(其一)
上一节通过键盘监听来给小球施加力,从而控制小球移动,这节接着学习。
学习的视频链接为:视频链接
P29 控制相机
1. 相机
tip:相机的朝向是其z轴方向
可以像修改其他物体的位置一样来修改相机的位置和旋转(缩放无效)
2. 获取对象
由于代码附在相机的组件中,所以获取相机这个对象中的Transform组件很容易。对象的名字直接就是gameObject
,想要获取transform组件则使用gameObject.transform
。(gameObject可以省略)
学习这部分参考的教程:链接
Tips:
物体:unity中在层级显示的东西都可以叫做物体
组件:unity中提供了大量已经写好的组件,比如刚体,碰撞体等,自己编写的脚本也是一种组件类
对象:挂载到物体上的脚本是一个实例化的组件,也就是一个对象。
一个游戏物体是一个对象;没有被挂载到物体上的脚本,是一个未被实例化的类,当脚本被挂载到物体上后,就变成了一个实实在在的对象。
GameObject.Find
与Transform.Find
的对比: 参考链接
GameObject.Find
遍历整个当前场景,挨个查找,效率偏低,非特殊情况一般不要使用。
Transform.Find
只查找自己本身以及自己的子对象,效率比较高,用途比较大。
Transform.Find
可以获取处于 激活/非激活状态 的游戏对象,返回值类型是Transform 类型。
GameObject.Find
只能获取处于 激活状态 的游戏对象,返回值类型是一个GameObject类型。
总结获取一个物体的组件:
- 脚本被挂载到物体上
//获取到组件后,将它的**引用**保存在rd字段中,方便下次使用
rd = gameobject.GetComponent<Rigidbody>();
//返回的类型是Rigidbody
- 脚本不在物体上
使用Public拖拽的方式手动获取游戏对象。(在Unity编辑器中赋值)
- 脚本不在物体上
使用GameObject.FindWithTag
或者GameObject.Find
找到物体,全局搜索(可能影响性能)。
playerTransform = GameObject.FindWithTag("Player").transform;
// 注:返回的是一个transform对象的引用!!!!!!很好
Tag(标签)可以在检查器中设置
- 物体是脚本的孩子节点
transform.Find()
,暂未进行实验验证
3. 相机跟随
public class FollowTarget : MonoBehaviour
{
public Transform playerTransform; //玩家的状态属性: 通过Unity编辑器赋值
private Vector3 offset_player_camera; //相机与玩家的相对位置
void Start()
{
//获取主相机位置
Vector3 cameraPosition = gameObject.transform.position;
//获取小球位置
playerTransform = GameObject.Find("Player").transform;
Vector3 playerPosition = playerTransform.position;
//计算位置差
offset_player_camera = cameraPosition - playerPosition;
}
void Update()
{
//更新主相机位置
transform.position = playerTransform.position + offset_player_camera;
}
}
P30 添加墙
在四周各安放一堵墙,防止小球滚出平面,很简单(添加立方体-改变位置大小-新建材质-绑定材质),结果如下。
P31 预制体(模板)
Tip:模型分组
创建一个空对象,设置位置为(0,0,0),修改名字为Env,将环境相关对象拖动进来(Env就像一个文件夹),好处很多(整洁、便于管理)。
模板
通过模板,可以统一修改多个外观相似物体的属性。
把场景中的某个物体拖动到Prefabs文件夹中,这个物体就成了模板。
我们可以复制那个被制成模板的物体,来创建多个相同的物体。
同时修改所有子物体的属性
我们如果修改模板的属性,则会同时修改所有由模板生成的物体的属性。
将子物体的属性的修改应用到模板
如果在其中的一个子物体中修改了某个属性,想让所有同类物体都更改。我们可以将这个修改覆盖到模板,这样模板变换了,所有子物体都会变换。
具体操作:覆盖–选择想覆盖的属性–应用–应用到预制件。
貌似“旋转”和“位置”无法覆盖。
P32 金币旋转
在预制体(模板)Coin中添加脚本。
使用以下代码完成金币的旋转
public class CoinRotate : MonoBehaviour
{
Transform coinTransform;
void Start()
{
coinTransform = gameObject.transform;
}
void Update()
{
//旋转采用欧拉角形式的 Vector3 参数。
//第二个参数是旋转轴,可以将其设置为本地轴 (Space.Self) 或全局轴 (Space.World)。
coinTransform.Rotate( new Vector3(0,1,0),Space.World);
}
}
Unity文档
或者用中文文档:链接