【问题标题】:How can i change each gameobject movement speed?如何更改每个游戏对象的移动速度?
【发布时间】:2016-07-30 10:20:52
【问题描述】:

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

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

然后在运行游戏时,它会复制 ThirdPersonController(1)。 所以我在层次结构中看到了更多的 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 > Animator 空状态中创建的原始控制器将其称为 Walk 并设置 HumandoidWalk。

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

_animaotr.speed = 10;

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

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

【问题讨论】:

    标签: c# unity3d unityscript unity5


    【解决方案1】:

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

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

    使用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()
        {
    
        }
    }
    

    【讨论】:

    • 属性 m_MoveSpeedMultiplier 不存在。
    • @TheLostLostit 请再次阅读说明。 “要在运行时访问它,您必须在 ThirdPersonCharacter 脚本中将 float m_MoveSpeedMultiplier = 1f; 更改为 public float m_MoveSpeedMultiplier = 1f;。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    相关资源
    最近更新 更多