2015-04-06 81 views
0

我目前正在做一个肖像游戏,我正试图实现类似游戏涂鸦跳跃或激进游戏的屏幕外移动逻辑。如何在屏幕右侧离开游戏对象时将其重新放置在屏幕左侧?

如何将游戏物体重新定位到屏幕的左侧,而不依赖于屏幕大小/长宽比时,屏幕的右侧和反之亦然?

这里的代码片段,我现在所拥有的:

void CheckBounds() 
    { 
     if (this.transform.position.x < -3.2f) 
     { 
      this.transform.position = new Vector3(3.2f, this.transform.position.y, this.transform.position.z); 
     } 

     if (this.transform.position.x > 3.2f) 
     { 
      this.transform.position = new Vector3(-3.2f, this.transform.position.y, this.transform.position.z); 
     } 
    } 

void MovePlayer() 
{ 
      if (isFacingLeft) 
     { 
      this.transform.position -= new Vector3(speed * Time.deltaTime, 0, 0); 
     } 
     else 
     { 
      this.transform.position += new Vector3(speed * Time.deltaTime, 0, 0); 
     } 
} 

现在这个工作,但它是一个肮脏的解决方案。正如你所看到的,当物体离开屏幕的+/- 3.2f时,我硬编码了边界。

这对16:9宽高比设备完美适用,但不适用于其他宽高比设备。

如何检测屏幕边缘以使其工作,而不管屏幕宽高比如何?

谢谢

+0

查看本教程,因为它不使用屏幕边界之外的任何对象来检查其位置。 https://youtu.be/VAmlb913-jc – Savlon 2015-04-08 01:25:50

回答

0

我更喜欢放置两个空标记左右限制。

如果角色超出游戏边界(左边限制或右边限制),则可以检查更新(或只是当角色移动以提高性能时)并相应地修复其位置:

喜欢的东西:

if(character.position.x < leftLimit.position.x - MARGIN) { 
    character.position.x = rightLimit.position.x - MARGIN; 
} 

if(character.position.x > rightLimit.position.x + MARGIN) { 
    character.position.x = leftLimit.position.x + MARGIN; 
} 

MARGIN增加了一个小的公差,以避免闪烁。

+0

感谢您的回答。我了解你的方法,但是如何将2个空物体放置在屏幕的左/右边缘而不依赖于设备的屏幕尺寸?你知道,没有目光。对Unity来说还是新手,对不起。 – aresz 2015-04-06 22:52:46

+0

我习惯于SpriteKit中的游戏编程。在那里,我只需使用0来获得左边缘和size.width以获得正确的边缘。 Unity中有类似的东西吗? – aresz 2015-04-07 02:14:44

+0

也许使用'相机'来获得世界点数。看看这个:http://answers.unity3d.com/questions/537081/how-to-make-the-player-stay-within-screen-in-a-sim.html – 2015-04-07 08:08:32

0

此脚本用于在屏幕边界(视口)内包装对象的屏幕。你所做的就是把这个脚本放到你的游戏对象上,剩下的就完成了。没有必要在你的相机外面碰撞器,它只是放置和玩耍。您还可以设置公共布尔值来确定是否希望您的游戏对象在宽度,高度或两者上进行换行。这里的视频教程:https://youtu.be/VAmlb913-jc

针对一堆Unity3D教程转向this website

using UnityEngine; 
using System.Collections; 

public class ScreenWrap : MonoBehaviour 
{ 
    public bool wrapWidth = true; 
    public bool wrapHeight = true; 

    private Renderer _renderer; 
    private Transform _transform; 
    private Camera _camera; 
    private Vector2 _viewportPosition; 
    private bool isWrappingWidth; 
    private bool isWrappingHeight; 
    private Vector2 _newPosition; 

    void Start() 
    { 
     _renderer = GetComponent <Renderer>(); 
     _transform = transform; 
     _camera = Camera.main; 
     _viewportPosition = Vector2.zero; 
     isWrappingWidth = false; 
     isWrappingHeight = false; 
     _newPosition = _transform.position; 
    } 

    void LateUpdate() 
    { 
     Wrap(); 
    } 

    private void Wrap() 
    { 
     bool isVisible = IsBeingRendered(); 

     if (isVisible) 
     { 
      isWrappingWidth = false; 
      isWrappingHeight = false; 
     } 

     _newPosition = _transform.position; 
     _viewportPosition = _camera.WorldToViewportPoint (_newPosition); 

     if (wrapWidth) 
     { 
      if (!isWrappingWidth) 
      { 
       if (_viewportPosition.x > 1) 
       { 
        _newPosition.x = _camera.ViewportToWorldPoint (Vector2.zero).x; 
        isWrappingWidth = true; 
       } 
       else if (_viewportPosition.x < 0) 
       { 
        _newPosition.x = _camera.ViewportToWorldPoint (Vector2.one).x; 
        isWrappingWidth = true; 
       } 
      } 
     } 

     if (wrapHeight) 
     { 
      if (!isWrappingHeight) 
      { 
       if (_viewportPosition.y > 1) 
       { 
        _newPosition.y = _camera.ViewportToWorldPoint (Vector2.zero).y; 
        isWrappingHeight = true; 
       } 
       else if (_viewportPosition.y < 0) 
       { 
        _newPosition.y = _camera.ViewportToWorldPoint (Vector2.one).y; 
        isWrappingHeight = true; 
       } 
      } 
     } 

     _transform.position = _newPosition; 
    } 

    private bool IsBeingRendered() 
    { 
     if (_renderer.isVisible) 
      return true; 
     return false; 
    } 
} 
1

我做了2个资产来解决这个问题:

对象边线2D &相机边线

他们让你简单地写:

if(player.GetLeftPosition().x > myCamera.GetRightPosition(10)) 

    player.MoveRightPosition(myCamera.GetLeftPosition(10)); 
  • 他们的工作与任何游戏对象的比例,精灵的枢轴,对撞机的大小或偏移量

资产链接:

物体边缘2D:http://u3d.as/wkF

相机边缘:http://u3d.as/xxB

希望你它可以帮助你&节省您的时间。

相关问题