我怎样才能改变每个游戏对象的移动速度?
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()
{
}
}
在层次结构中,我有 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()
{
}
}