Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使克隆人在其父对象移动时忽略移动输入_C#_Unity3d_Parent Child - Fatal编程技术网

C# 如何使克隆人在其父对象移动时忽略移动输入

C# 如何使克隆人在其父对象移动时忽略移动输入,c#,unity3d,parent-child,C#,Unity3d,Parent Child,我使用move_states来跟踪角色的移动,但它只能跟踪自身,当角色拆分为两个角色时,如何让克隆人在其父角色移动时忽略玩家的输入 脚本的运动输入部分: private void Movement_input() { 如果(移动状态==0) { if(Input.GetKey(KeyCode.UpArrow)) { 移动状态=1; 目标位置=变换位置+新矢量3(0,0.8f,0); } else if(Input.GetKey(KeyCode.DownArrow)) { 移动状态=1; 目标位

我使用move_states来跟踪角色的移动,但它只能跟踪自身,当角色拆分为两个角色时,如何让克隆人在其父角色移动时忽略玩家的输入

脚本的运动输入部分:

private void Movement_input()
{
如果(移动状态==0)
{
if(Input.GetKey(KeyCode.UpArrow))
{
移动状态=1;
目标位置=变换位置+新矢量3(0,0.8f,0);
}
else if(Input.GetKey(KeyCode.DownArrow))
{
移动状态=1;
目标位置=变换位置+新矢量3(0,-0.8f,0);
}
else if(Input.GetKey(KeyCode.LeftArrow))
{
移动状态=1;
目标位置=transform.position+新向量3(-1,0,0);
}
else if(Input.GetKey(KeyCode.RightArrow))
{
移动状态=1;
目标位置=transform.position+新向量3(1,0,0);
}
}
}

谢谢你的帮助

如果我没有理解错,您有一个可以克隆的对象,它的脚本也被克隆。一个简单的解决方案是禁用子脚本no


当你说parent时,你是指层次结构parent还是仅指克隆的对象?如果是层次结构父对象,您只需将子对象与其父对象分离。

我将使用另一个脚本将克隆的对象作为单独的预制对象。从主脚本中,您可以获取对克隆的引用,并在每次移动克隆时对其调用方法。像这样的,

private Gameobject[] copies;
private int dir; 

public void MoveClones()
{
    for (int i = 0; i < copies.Length; i++)
    {
        copies[i].SendMessage("MoveDir", dir);
    }
}
private Gameobject[]拷贝;
私人内部目录;
公共空间移动克隆()
{
对于(int i=0;i

然后,您的MoveDir函数位于克隆对象脚本中,其中有一个用于方向的参数。您可以在那里检查自身的移动状态。

您有一些选择

例如: 我将分别实例化这些子对象,并在每个子对象(甚至第一个)中使用标记(“克隆”)。 然后,每次您尝试移动其中一个对象时(您必须找出一种方法来决定哪个对象具有优先级),如果有人将状态移动到0,则必须使用循环搜索标记为“clone”的对象

其中一些代码可能是:

bool canMove = true;
for each (GameObject clone in GameObject.FindGameObjectsWithTag()){
    if (clone.GetComponent<script>().move_states == 1)
        canMove = false;
}
if(canMove == true)
    Movement_input(); 
bool canMove=true;
对于每个(GameObject.FindGameObjectsWithTag()中的GameObject克隆){
if(clone.GetComponent().move_states==1)
canMove=false;
}
if(canMove==true)
运动输入();

如果你能让它工作,请告诉我;)

有趣的是,你“克隆”了对象,你是在实例化同一个对象吗?请在“克隆”对象的地方添加代码,以便我们(更好地)了解发生了什么。非常感谢您回答我的问题,您理解得很好。我使用Object.Instantiate()来克隆新对象,但实际上我想跟踪每个克隆的脚本,包括第一个,如果它们的移动状态都等于0,那么它们可以移动,如果其中任何一个(克隆的一个或其父级)正在移动,那么其他脚本都不会移动。所以我可以使用什么方法,或者我可以使用什么函数,我在儿童中尝试过GetComponents,但没有成功,我是一个新手,所以我真的需要你的帮助,非常感谢。顺便说一句,move_声明在这个类中是一个公共int。好吧,现在我完全理解你的问题(我希望如此)。哦,按enter键。好的,我最好回答。谢谢你的帮助,但是我怎样才能让他们像以前一样一起移动,只有被卡住的一个在其他人移动时不能移动。(如果他们一起移动,右边的一个在舞台的边缘,所以它是一个被卡住的一个)非常感谢!!!哦,现在有点复杂了。您可以对子级使用另一种方法,该方法在按下按钮移动玩家时调用,然后返回bool,确定它是否能够移动,然后如果bool返回true,则允许玩家移动并发出指示。只是想而不是写出来,听起来这可能不是最好的方法,但你永远不会知道,直到你实现它。谢谢,它奏效了。但是我遇到了一个新问题T0T,你知道unity脚本是线性运行的,引擎运行所有的脚本遍历,所以如果有人移动(move_states==1),其他人就不能再移动了。但是我怎么能让他们像以前一样一起移动,只有被卡住的一个在其他人移动时不能移动。(如果他们一起移动,右边的一个在舞台的边缘,所以它是一个被卡住的一个)如果我按下右箭头,然后立即按下左箭头,当左边的人也向右走的时候,被绊倒的人会意外地向左走。谢谢!!!我用最新更新修复了它,THX很多。