在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?
答案 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()
{
}
}