如何更改每个游戏对象的移动速度?

时间:2016-07-30 10:20:52

标签: c# unity3d unityscript unity5

在Hierarchy中我有2个ThirdPersonController。 在窗口中> Animator我创建了一个名为Walk的新空状态并将其设置为HumanoidWalk,因此在运行游戏时,两个玩家都在行走。

在其中一个上面我添加了脚本,并作为Prefab添加了第二个ThirdPersonController(1)。

然后在运行游戏时,它会制作ThirdPersonController(1)的克隆。 所以我在Hierarchy中看到更多N ThirdPersoncontrollers。

今天为了改变每个ThirdPersonController的行走速度,我在Inspector中更改了Move Speed Multiplier。 但是,如果我想在脚本中创建克隆时将其设置为另一个速度,我该怎么办呢?

using UnityEngine;
using System.Collections;

public class Multiple_objects : MonoBehaviour {

    public GameObject prefab;
    public GameObject[] gos;
    public int NumberOfObjects;

    void Awake()
    {
            gos = new GameObject[NumberOfObjects];
        for(int i = 0; i < gos.Length; i++)
        {
            GameObject clone = (GameObject)Instantiate(prefab, Vector3.zero, Quaternion.identity);
            gos [i] = clone;

        }
    }

    // Use this for initialization
    void Start () {


    }

    // Update is called once per frame
    void Update () {

    }
}

我现在尝试的是获取Prefab的Animator组件并将速度设置为所有克隆:

using UnityEngine;
using System.Collections;

public class Multiple_objects : MonoBehaviour {

    public GameObject prefab;
    public GameObject[] gos;
    public int NumberOfObjects;
    private Animator _animaotr;

    void Awake()
    {
            gos = new GameObject[NumberOfObjects];
        for(int i = 0; i < gos.Length; i++)
        {
            GameObject clone = (GameObject)Instantiate(prefab, Vector3.zero, Quaternion.identity);
            gos [i] = clone;
            _animaotr.speed = 10;
        }
    }

    // Use this for initialization
    void Start () {

        _animaotr = prefab.GetComponent<Animator> ();

    }

    // Update is called once per frame
    void Update () {

    }
}

但主要的问题是,我在层次结构中的第一个ThirdPersonController中创建了一个我在Window&gt;中创建的原始控件。 Animator空状态称为Walk并设置HumandoidWalk。

现在设置速度由于某种原因改变Animator速度永远不会影响任何东西,例如:

_animaotr.speed = 10;

仅在更改ThirdPersonController&gt;中的速度时检查员&gt;第三人称角色(剧本)&gt;移动速度倍增器。并且它将相同的速度更改为层次结构中的所有ThirdPerson控制器,包括此克隆。

但是我如何将每个克隆速度更改为另一个速度?为什么_animator.speed没有改变任何东西,我需要使用这个Move Speed Multiplier?

1 个答案:

答案 0 :(得分:0)

编辑器中显示的移动速度倍增器属性在m_MoveSpeedMultiplier脚本中声明为ThirdPersonCharacter。它是float m_MoveSpeedMultiplier = 1f;的delacre,这意味着它是private变量,不能从另一个脚本访问。它在编辑器中显示的原因是因为它上面有[SerializeField],这意味着它是一个序列化的private变量。

要在运行时访问它,您必须在float m_MoveSpeedMultiplier = 1f;脚本中从public float m_MoveSpeedMultiplier = 1f;更改为ThirdPersonCharacter

使用GetComponent从gos GameObject获取ThirdPersonCharacter的实例,然后将其保存在某个地方以便重新使用。由于您有2个ThirdPersonCharacter,因此可以创建两个ThirdPersonCharacter数组来保存这些实例。它应该类似于下面的代码:

using UnityEngine;
using System.Collections;
using UnityStandardAssets.Characters.ThirdPerson;

public class Multiple_objects : MonoBehaviour
{
    public GameObject prefab;
    public GameObject[] gos;
    public int NumberOfObjects;

    private ThirdPersonCharacter[] thirdPersonCharacter;

    void Awake()
    {
        thirdPersonCharacter = new ThirdPersonCharacter[2];

        gos = new GameObject[NumberOfObjects];
        for (int i = 0; i < gos.Length; i++)
        {
            GameObject clone = (GameObject)Instantiate(prefab, Vector3.zero, Quaternion.identity);
            gos[i] = clone;
            thirdPersonCharacter[i] = clone.GetComponent<ThirdPersonCharacter>();
        }
    }

    // Use this for initialization
    void Start()
    {

        thirdPersonCharacter[0].m_MoveSpeedMultiplier = 5f;
        thirdPersonCharacter[1].m_MoveSpeedMultiplier = 5f;
    }

    // Update is called once per frame
    void Update()
    {

    }
}