我怎样才能改变每个游戏对象的移动速度?

How can i change each gameobject movement speed?

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

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

然后当 运行 游戏正在制作 ThirdPersonController(1) 的克隆。 所以我在层次结构中看到更多 N ThirdPersoncontrollers。

今天为了改变每个 ThirdPersonController 的行走速度,我在 Inspector 中改变了移动速度倍增器。 但是,如果我想在创建克隆时在脚本中设置彼此的速度,我该怎么做?

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 > Animator 空状态中创建的原始控制器称为 Walk 并设置了 HumandoidWalk。

现在设置速度出于某种原因更改 Animator 速度不会有任何效果,例如:

_animaotr.speed = 10;

仅当在 ThirdPersonController > Inspector > Third Person Character (Script) > Move Speed Multiplier 中更改速度时。它正在以相同的速度改变层次结构中的所有 ThirdPersoncontroller,包括我克隆的这个。

但是如何将每个克隆速度更改为另一个速度值?为什么 _animator.speed 没有改变任何东西,我需要使用这个移动速度倍增器?

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

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

使用 GetComponent 从 gos 游戏对象中获取 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()
    {

    }
}