【问题标题】:Move player along Y pos沿 Y 位置移动玩家
【发布时间】:2015-09-09 03:30:08
【问题描述】:

我最近从 SpriteKit 和 Swift 迁移到 Unity,并且开始了一个 Android 项目。我想要的是仅沿 Y 位置上下移动播放器。在 xcode 中,我会简单地这样做:

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        let action = SKAction.moveToY(location.y, duration: 0.7)
        action.timingMode = .EaseInEaseOut
        player.runAction(action)
    }
}

这种代码会以同样的方式转换为 C# 吗?或者它的工作方式不同。

** 更新 **

这是我尝试使用以下答案之一的代码,但玩家正在消失而不是移动,有什么建议吗?我所追求的是让玩家移动到点击屏幕的位置,但只能在 Y 轴上。谢谢:)

 Vector2 touchPosition;
        [SerializeField] float speed = 1f;   

void Update() {

            for (var i = 0; i < Input.touchCount; i++) {

                if (Input.GetTouch(i).phase == TouchPhase.Began) {

                    // assign new position to where finger was pressed
                    transform.position = new Vector3 (transform.position.x, Input.GetTouch(i).position.y, transform.position.z);

                }
            }    
        }

【问题讨论】:

    标签: c# android unity3d


    【解决方案1】:

    您可以移动场景中的任何对象,方法是从该对象的脚本中调用 transform.Translate(),或者获取对另一个对象的变换的引用并在其上调用 Translate()。

    根据手指移动移动当前脚本的场景对象

    Vector2 touchDeltaPosition;
    [SerializeField] float speed = 1f;
    
    void Update() {
    
        for (var i = 0; i < Input.touchCount; i++) {
    
            if (Input.GetTouch(i).phase == TouchPhase.Moved) {
    
                // get new finger position
                touchDeltaPosition = Input.GetTouch(i).deltaPosition;
    
                // move scene object along y axis
                transform.Translate(0f, -touchDeltaPosition.y * speed, 0f);
    
            }
    
        }    
    
    }
    

    将当前脚本的场景对象移动到手指按下位置

    void Update() {
    
        for (var i = 0; i < Input.touchCount; i++) {
    
            if (Input.GetTouch(i).phase == TouchPhase.Began) {
    
                // assign new position to where finger was pressed
                transform.position = new Vector3 (transform.position.x, Input.GetTouch(i).position.y, transform.position.z);
    
            }
    
        }    
    
    }
    

    【讨论】:

    • 如果 .Moved 检查手指是否在屏幕上移动并随之移动播放器,是否有办法将播放器也移动到沿 Y 轴轻按屏幕的位置?
    • 您可以使用 .Began 代替 .Moved,也可以使用 .position 代替 .deltaPosition。 transform.position = new Vector2(transform.position.x, Input.GetTouch(i).position.y);
    • 我认为我将代码正确地更改为您所说的内容,但我已在顶部编辑了我的问题。点击屏幕时播放器消失。
    • 尝试将赋值行更改为:transform.position = new Vector3(transform.position.x, Input.GetTouch(i).position.y, transform.position.z);此外,如果直接更改位置,则无需调用 Translate()。我会更新我的答案...
    • 刚刚改了代码,播放器不再消失,只是在点击屏幕时向上移动一点点,然后不再移动。
    【解决方案2】:
    public float speed = 5.0f;
    
    public void Update()
    {
        Vector3 moveDelta = new Vector3(0f, Input.GetAxis("Vertical"), 0f);
        transform.Translate(moveDelta * speed * Time.deltatime)
    }
    

    【讨论】:

    • 谢谢。 Input.GetAxis 如何转换为 Android 设备的触摸位置?
    【解决方案3】:

    对于任何需要知道的人,这就是它对我的工作方式:

    公共游戏对象 thingToMove;

    public float smooth = 2;
    
    private Vector3 _endPosition;
    
    private Vector3 _startPosition;
    
    private void Awake()
    {
        _startPosition = thingToMove.transform.position;
    }
    
    private void Update()
    {
        if(Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
        {
            _endPosition = HandleTouchInput();
        }
        else
        {
            _endPosition = HandleMouseInput();
        }
    
        thingToMove.transform.position = Vector3.Lerp(thingToMove.transform.position, new Vector3(transform.position.x, _endPosition.y, 0), Time.deltaTime * smooth);
    }
    
    private Vector3 HandleTouchInput()
    {
        for (var i = 0; i < Input.touchCount; i++) 
        {
            if (Input.GetTouch(i).phase == TouchPhase.Began) 
            {
                var screenPosition = Input.GetTouch(i).position;
                _startPosition = Camera.main.ScreenToWorldPoint(screenPosition);
            }
        }
    
        return _startPosition;
    }
    
    private Vector3 HandleMouseInput()
    {
        if(Input.GetMouseButtonDown(0))
        {
            var screenPosition = Input.mousePosition;
            _startPosition = Camera.main.ScreenToWorldPoint(screenPosition);
        }
    
        return _startPosition;
    }
    

    这会使用 .Lerp 将对象平滑地移动到触摸位置。更多信息: http://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      相关资源
      最近更新 更多