一.GameObject 对象的初始化:
//从UNITY工具中将预制键托给g
Public GameObject g;
//创建预制件对象,Instantiate()返回值为Object 须强制转换为GameObject类型
GameObject a =(GameObject) GameObject.Instantiate(g);
//创建UNITY工具为你封装好的几个模型(即PrimitiveType枚举类型中的几个)
GameObject b = GameObject.CreatePrimitive(PrimitiveType.Cube);
//改变对象a的Tranform中的Scale
a.transform.localScale = new Vector3(0.8f,0.8f,0.8f);
//改变对象a的Transform中的Position
a. transform.position = new Vector3(x,y,z);
二.创建带动画的预制件模型
将模型拖到Hierarchy菜单中,给它加载动画,创建一个Animation Controller 然后将动画Take1托到给Animation Controller,图标默认为黄色,然后将这个Animation Controller 赋给这个实体,将这个实体托到Project即创建一个预制件成功.最后把预制件拖到脚本的G的公开变量中,传递到脚本内供其调用。
三.命名:
创建空的GameObject做为一个总体脚本的管理者,命名为Managers,然后在给它创建孩子,即各自的脚本管理者,命名为xxxxManager.
预制件命名为xxxxPrefab.
材质命名为xxxxMat
脚本命名为xxxxScript
四.案例——实现一个方块在摄像头正中心移动,后方有两排楼房动态的变换
- 创建管理器
在Hierarchy栏中创建一个管理器Manager(即一个空的GameObject类型),给它创建两个孩子,SkylineCloseManager 管理近处的楼房,SkylineCloseManager 管理远处的楼房. - 编写天空边际线脚本(即控制两排楼房生成的脚本)—-CreateSkylineScript
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class CreateSkylineScript : MonoBehaviour
{
public GameObject skylinePrefab;
public int prefabNumber;
public Vector3 startPosition;
Vector3 nextPosition;
Queue<GameObject> skyline;
public Vector3 minSize;
public Vector3 maxSize;
public float setoff;
void Start()
{
skyline = new Queue<GameObject>(prefabNumber);
for (int i = 0; i < prefabNumber; i++)
{
skyline.Enqueue((GameObject)GameObject.Instantiate(skylinePrefab));
}
nextPosition = startPosition;
for (int i = 0; i < prefabNumber; i++)
{
Recycle();
}
}
//动画播放一帧就检测一次
void Update()
{
//当前Runner的Position.x减去最后一个楼房的距离超过设定阈值时调用Recycle函数 重新生成这个楼房的大小和位置.
if (RunnerScript.distance - skyline.Peek().transform.position.x >= setoff)
{
Recycle();
}
}
void Recycle()
{
//随即该楼的Scale大小
Vector3 scale = new Vector3(Random.Range(minSize.x, maxSize.x), Random.Range(minSize.y, maxSize.y), Random.Range(minSize.z, maxSize.z));
GameObject o = skyline.Dequeue();
//当前的楼的位置
Vector3 position = nextPosition;
//上一次的位置再向右移动自己宽度的一半
position.x += scale.x * 0.5f;
//因为楼的坐标是按中心点算的,所以所有的楼都要向上提自身高度的一半,这里的position.y是nextPosition.y同时也是StartPosition.y
position.y += scale.y * 0.5f;
//将楼的scale和position赋值给楼本身
o.transform.localScale = scale;
o.transform.position = position;
//计算下一次楼的水平位置的基准即前几栋楼的长度和。下一次楼的位置是这个基准再加上下一次楼的长度的一半
nextPosition.x += scale.x;
skyline.Enqueue(o);
}
}
将此脚本分别托给SkylineCloseManager和SkyFarawayManager然后给公开的变量赋值。
3.创建一个cube更名为Runner,reset它的坐标,将主摄像机放到它的孩子中。然后编写Runner 的脚本 —–RunnerScript
作用是让这个Runner动起来,并且公开一个distance静态变量供上面的CreateSkylineScript脚本使用。
using UnityEngine;
using System.Collections;
public class RunnerScript : MonoBehaviour
{
public static float distance;
// Update is called once per frame
void Update()
{
transform.Translate(5f * Time.deltaTime, 0, 0);
distance = transform.position.x;
}
}
4.调节脚本公开参数的大小,然后改变主摄像机的background,调一个淡一点的颜色。再加个世界光。。。
五.案例总结
1.关于实体Transform中的Position,Rotation,Scale的理解:
Position代表的是这个实体的坐标,Rotation代表的是这个实体的旋转角度,Scale带表的是实体的大小。
Position和Scale中的参数是对应的, 具体代表的不是像素,而是一个倍数关系,这一点应值得注意。其实可以单纯的将其理解为一个数字,具体操控起来就和正常的一样。Position和Scale的参数值都是按模型的中心点计算的。
2.关于Position和LocalPosition等一些列
Position是以世界坐标轴为参考系;
Location是以父级容器为参考系的。
六.Unity API–MonoBehaviour.Awake () 和MonoBehaviour.FixedUpdate()
1.MonoBehaviour.Awake () Awake is used to initialize any variables or game state before the game starts 被用作在游戏开始之前一些变量或者游戏状态的初始化。 用于替代构造函数。 比Start还靠前。
2 . MonoBehaviour.FixedUpdate() This function is called every fixed framerate frame, if the MonoBehaviour is enabled. 这个函数被调用每个固定帧速率,如果MonoBehaviour启用。 FixedUpdate should be used instead of Update when dealing with Rigidbody. FixedUpdate被用作替代 Update 当处理 Rigidbody(刚体)时.
For example when adding a force to a rigidbody, you have to apply the force every fixed frame inside FixedUpdate instead of every frame inside Update.
例如rigidbody当添加一个力,你必须施加的力每固定帧内FixedUpdate代替每一帧内更新。
通俗的讲就是你要给刚体加一个力时,使用FixedUpdate去更新每一固定帧内刚体力的变化.
Unity游戏开发基础:GameObject对象的初始化与管理
本文详细介绍了Unity中GameObject对象的初始化、创建动画预制件、命名规范及案例实现。包括如何通过脚本操作GameObject的位置、旋转、缩放,创建带有动画的预制件,以及如何在场景中合理命名和组织脚本、预制件和材质。通过一个方块移动和动态楼房变换的案例,展示了如何使用脚本来动态控制游戏元素。
16万+

被折叠的 条评论
为什么被折叠?



