如何使父游戏对象在屏幕中居中?
How to center parent game object in the screen?
我正在尝试使用固定相机制作拼字游戏,但我遇到了一个简单的问题。
我添加了一些盒子作为游戏对象,这些盒子的数量是单词的长度,所以如果单词是 "Fish" 我们将动态添加 4 个盒子。我成功地做到了,但我无法将这些框放在屏幕中央。我尝试将这些游戏对象作为子对象添加到另一个游戏对象下,然后将父对象居中,但没有任何效果。
这是我的代码:
void Start () {
for (int i=0; i<word.Length; i++) {
GameObject LetterSpaceObj = Instantiate(Resources.Load ("LetterSpace", typeof(GameObject))) as GameObject;
LetterSpaceObj.transform.parent = gameObject.transform;
LetterSpaceObj.transform.localPosition = new Vector2(i*1.5f,0.0f);
LetterSpaceObj.name = "LetterSpace-"+count.ToString();
count++;
}
gameObject.transform.position = new Vector2 (0.0f, 0.0f);
}
这张图片向您展示了这个想法:
我相信你的代码可以工作,但问题是你的第一个字母位于你的父对象,然后每个字母都添加到右边。这意味着当您将父对象居中时,您所做的就是将第一个字母放在屏幕的中央。
如果您 运行 游戏并使用场景视图查看父对象的位置可以确认这一点。您可以做的是,不要将父项放在屏幕中央,而是将其偏移等于单词长度的量。
gameObject.transform.position = new Vector2 (-(word.Length / 2.0f) * 1.5f, 0.0f);
您可能还想考虑将其中一些常量(例如 1.5f)更改为名称为 LetterSize 的变量,或者将其基于实际的预制件,以便将来的任何更改都将自动生效。
这是经过一些编辑以解决此问题后的最后一个解决方案。
GameObject LetterSpaceObjRow;
int count = 1;
string word = "Father";
float ObjectXPos;
float LocalScaleX;
void Start () {
for (int i=0; i<word.Length; i++) {
GameObject LetterSpaceObj = Instantiate(Resources.Load ("LetterSpace", typeof(GameObject))) as GameObject;
LocalScaleX = LetterSpaceObj.transform.localScale.x;
ObjectXPos = i*(LocalScaleX+(LocalScaleX/2));
LetterSpaceObj.transform.parent = gameObject.transform;
LetterSpaceObj.transform.localPosition = new Vector2(ObjectXPos,0.0f);
LetterSpaceObj.name = "LetterSpace-"+count.ToString();
count++;
}
gameObject.transform.position = new Vector2 (-(ObjectXPos/2.0f) , 0.0f);
}
我正在尝试使用固定相机制作拼字游戏,但我遇到了一个简单的问题。
我添加了一些盒子作为游戏对象,这些盒子的数量是单词的长度,所以如果单词是 "Fish" 我们将动态添加 4 个盒子。我成功地做到了,但我无法将这些框放在屏幕中央。我尝试将这些游戏对象作为子对象添加到另一个游戏对象下,然后将父对象居中,但没有任何效果。
这是我的代码:
void Start () {
for (int i=0; i<word.Length; i++) {
GameObject LetterSpaceObj = Instantiate(Resources.Load ("LetterSpace", typeof(GameObject))) as GameObject;
LetterSpaceObj.transform.parent = gameObject.transform;
LetterSpaceObj.transform.localPosition = new Vector2(i*1.5f,0.0f);
LetterSpaceObj.name = "LetterSpace-"+count.ToString();
count++;
}
gameObject.transform.position = new Vector2 (0.0f, 0.0f);
}
这张图片向您展示了这个想法:
我相信你的代码可以工作,但问题是你的第一个字母位于你的父对象,然后每个字母都添加到右边。这意味着当您将父对象居中时,您所做的就是将第一个字母放在屏幕的中央。
如果您 运行 游戏并使用场景视图查看父对象的位置可以确认这一点。您可以做的是,不要将父项放在屏幕中央,而是将其偏移等于单词长度的量。
gameObject.transform.position = new Vector2 (-(word.Length / 2.0f) * 1.5f, 0.0f);
您可能还想考虑将其中一些常量(例如 1.5f)更改为名称为 LetterSize 的变量,或者将其基于实际的预制件,以便将来的任何更改都将自动生效。
这是经过一些编辑以解决此问题后的最后一个解决方案。
GameObject LetterSpaceObjRow;
int count = 1;
string word = "Father";
float ObjectXPos;
float LocalScaleX;
void Start () {
for (int i=0; i<word.Length; i++) {
GameObject LetterSpaceObj = Instantiate(Resources.Load ("LetterSpace", typeof(GameObject))) as GameObject;
LocalScaleX = LetterSpaceObj.transform.localScale.x;
ObjectXPos = i*(LocalScaleX+(LocalScaleX/2));
LetterSpaceObj.transform.parent = gameObject.transform;
LetterSpaceObj.transform.localPosition = new Vector2(ObjectXPos,0.0f);
LetterSpaceObj.name = "LetterSpace-"+count.ToString();
count++;
}
gameObject.transform.position = new Vector2 (-(ObjectXPos/2.0f) , 0.0f);
}