我的游戏中有4个游戏对象,并且我想使用滑块更改这些对象的X和Y值。但是我不知道该怎么办。我需要帮助。
现在,我使用按钮使用下面的代码播放动画,但我想使用滑块更改游戏对象的位置。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playbut : MonoBehaviour {
public GameObject anim;
public GameObject anim1;
public GameObject anim2;
public GameObject scrool;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
public void OnClick(){
anim.GetComponent<Animator> ().Play ("div");
anim1.GetComponent<Animator> ().Play ("div1");
StartCoroutine(WaitandPrint(2));
anim2.GetComponent<Animator> ().Play ("div2");
}
private IEnumerator WaitandPrint(float waitTime)
{
yield return new WaitForSeconds (waitTime);
scrool.SetActive (true);
}
}
这就是我想要的:
所有游戏对象的位置都是X:-2.6:Y:-2.09,但是当我滑动滑块时,游戏对象的位置应该像这样:
游戏对象1 = X:2.5 Y:-0.03
游戏对象2 = X:-5.74 Y:0.09
游戏对象3 = X:-2.18 Y:2.48
游戏对象4 = X:-2.6 Y:-2.09
答案 0 :(得分:1)
我建议使用屏幕空间画布,并创建一个新的Slider UI元素作为该画布的子元素。
如果您对如何执行操作感到困惑,请在线搜索Unity uGUI教程。
然后,您将要编写一个脚本来定义当Slider的值更改时要调用的方法。可以通过滑块上的检查器进行设置。
该脚本应该引用应该移动的游戏对象的“变换”,并且在更改“ Slider”值时调用的方法应更改“变换”的位置成员。
如果您对如何操作感到困惑,请在线搜索Unity脚本教程。
答案 1 :(得分:1)
根据您的需要,我看到了几种方法。
编辑:在您提供了其他详细信息之后,据我了解,所有游戏对象只有一个滑块。您要根据滑块的位置在两个点之间设置每个gameObject的位置。就像线性插值一样。
如果是这样:
Size
属性设置为4
以处理您的4个对象。它将创建一个包含4个条目的数组。Transform
字段PositionA
),它是滑块值等于0
时对象的位置PositionB
),它是滑块值等于1
时对象的位置Points Color
,以便“场景”视图中的小控件的颜色将使其更易于识别0
到1
,并且SetPosition
是onValueChanged
事件的回调。On Value Changed
事件中添加一个新条目(仅一个)。拖放包含脚本的gameObject,然后选择组件的SetPosition (dynamic float)
功能PositionA
到PositionB
的情况。using UnityEngine;
[System.Serializable]
public struct TransformBetweenPoints // could not find an appropriate name....
{
[SerializeField]
private Vector3 positionA;
[SerializeField]
private Vector3 positionB;
[SerializeField]
private Transform transform;
public void SetPosition( float t )
{
if( transform != null )
transform.position = Vector3.Lerp( positionA, positionB, t );
}
#if UNITY_EDITOR
[SerializeField]
private Color pointsColor;
public void DrawGizmos()
{
Color gizmosColor = Gizmos.color;
if ( pointsColor.a <= Mathf.Epsilon ) pointsColor.a = 1;
if( transform != null )
{
Gizmos.color = Color.red;
Gizmos.DrawRay( transform.position, Vector3.right );
Gizmos.color = Color.green;
Gizmos.DrawRay( transform.position, Vector3.up );
Gizmos.color = Color.blue;
Gizmos.DrawRay( transform.position, Vector3.forward );
Gizmos.color = pointsColor;
Gizmos.DrawWireSphere( transform.position, 0.2f );
}
Gizmos.color = pointsColor;
Gizmos.DrawLine( positionA - Vector3.right, positionA + Vector3.right );
Gizmos.DrawLine( positionB - Vector3.right, positionB + Vector3.right );
Gizmos.DrawLine( positionA - Vector3.up, positionA + Vector3.up );
Gizmos.DrawLine( positionB - Vector3.up, positionB + Vector3.up );
Gizmos.DrawLine( positionA - Vector3.forward, positionA + Vector3.forward );
Gizmos.DrawLine( positionB - Vector3.forward, positionB + Vector3.forward );
Gizmos.color = gizmosColor;
}
#endif
}
public class PositionHandler : MonoBehaviour
{
[SerializeField]
private TransformBetweenPoints[] transforms;
public void SetPosition( float value )
{
for ( int i = 0 ; i < transforms.Length ; ++i )
transforms[i].SetPosition( value );
}
#if UNITY_EDITOR
public void OnDrawGizmosSelected()
{
for ( int i = 0 ; transforms != null && i < transforms.Length ; ++i )
transforms[i].DrawGizmos();
}
#endif
}
如果每个对象有2个滑块(4个对象总共8个滑块),则可以将以下脚本附加到要移动的每个对象上,然后call the appropriate function in the onValueChanged
of the slider。您必须更改滑块的范围才能根据需要移动对象。
using UnityEngine;
public class PositionHandler : MonoBehaviour
{
private Vector3 position;
public void SetPositionX( float value )
{
position = transform.position;
position.x = value ;
transform.position = position;
}
public void SetPositionY( float value )
{
position = transform.position;
position.y = value ;
transform.position = position;
}
}
如果所有对象只有2个滑条,则需要以下脚本,您可以将其附加到一个空的gameObject或包含2个滑条的面板中,以及通过其他方式更改Target
属性的方式脚本或相同脚本,具体取决于您要执行的操作)。同样,您将必须在SetPosition
事件中指定onValueChange
回调。
using UnityEngine;
public class PositionSlider : MonoBehaviour
{
[SerializeField]
private Transform target;
private Vector3 position;
public Transform Target
{
get { return target ; }
set { target = value ; }
}
public void SetPositionX( float value )
{
if( Target == null )
{
Debug.LogError("The target is null, can't set its position!");
return;
}
position = Target.position;
position.x = value ;
Target.position = position;
}
public void SetPositionY( float value )
{
if( Target == null )
{
Debug.LogError("The target is null, can't set its position!");
return;
}
position = Target.position;
position.y = value ;
Target.position = position;
}
}
请编辑您的问题,并添加有关您问题的详细信息以获取足够的帮助。