前段时间毕业了,到处跑着玩,玩傻了之后入职了又摸了一个多月鱼~收收心了,近期的学习计划是下半年入门图形学,九月中旬把线性代数学完,所以unity和游戏开发的文章还是很少更新了,等后期学习图形学再慢慢更新和学习记录吧,中间工作中遇到的一些问题还是会记录一下给和我一样刚入职场的小菜鸡一些帮助吧。 今天在工作的时候通过一个脚本中的方法来调用另一个方法中的某个静态方法生成场景或对象,但是很好奇这样调用代码的时候后者的函数生命周期和静态方法的顺序和相互之间有没有影响,带着这样的疑问今天就想通过日志打印来记录一下这样一个问题的答案。
两个脚本分别是childScript、buttonscript;第一个作为静态生成方法挂载到要生成的cube上去,buttonscript挂载到按钮来达到动态生成和隐藏效果以便打印日志和观察状态
public class buttonscript : MonoBehaviour
{
public GameObject Cube;
bool isSetActive = false;
void Start()
{
}
public void onClick()
{
if (isSetActive == false)
{
childScript.SetData(Cube);
}
else
{
Cube.SetActive(false);
}
isSetActive = !isSetActive;
}
}
public class childScript : MonoBehaviour
{
public static int meathodSum = 0;
private void Awake()
{
meathodSum++;
Debug.Log("there is Awake meathod!"+ meathodSum);
}
private void OnEnable()
{
meathodSum++;
Debug.Log("there is OnEnable meathod!" + meathodSum);
}
void Start()
{
meathodSum++;
Debug.Log("there is Start meathod!" + meathodSum);
}
public static void SetData(GameObject cube)
{
meathodSum++;
Debug.Log("there is SetData Meathod before setactive !" + meathodSum);
cube.SetActive(true);
Debug.Log("there is SetData Meathod behind setactive!" + meathodSum);
}
}
运行程序前分别将Cube设置为隐藏和显示,并通过按钮来调用静态方法切换状态,以此来观察日志的函数顺序。首先隐藏的时候运行时日志打印内容为空 按下一次按钮时 再次按下按钮关闭后,再次打开 通过日志显而易见,在预制体或游戏对象处于关闭状态时任何方法都不会运行,当从外部调用静态方法生成时,最先走的是SetData方法,所以我们在书写代码时总是喜欢通过setdata来传参传入数据给chidscript脚本实例化初始化游戏对象或场景,在数据都赋值和初始化完成后,setactive设置为true,此时会直接运行awake,也就是第一次生成显示的时候awake是最先的,其次是oneable,而setdata运行完之后,第一帧之前才是start,这样的日志打印逻辑顺序就很清晰了。 接下来继续看关闭打开之后的日志,即使我们重新打开或者显示之后,但是由于cube已经在第一次生成过了,我们并没有销毁而是隐藏所以awake和该物体生成后的第一帧之前的start就不会再运行了,但是oneable确实每次调用,但是这里就有一个疑问,oneable是因为setactive为true了才调用,还是默认就回调用呢? 那我们试验一下就好在childscript中的setdata方法加一个 if(meathodSum<3) cube.SetActive(true); 这样就能保证第二次true时oneable有没有和setactive为true有关了 很明显oneable就是在每次显示的时候会调用,这样我们就把awake、oneable和start以及静态生成方法setdata的运行逻辑理解了,我们就可以根据这四个方法每个人不同的运行逻辑顺序以及特点来完成我们一些奇奇怪怪的需求功能了~ 好了,今天就记到这吧,希望能给大家一点启发,学线代了5555555(高数挂过科的菜鸡落泪)
|