Unity预处理器指令错误?

Posted

技术标签:

【中文标题】Unity预处理器指令错误?【英文标题】:Unity Preprocessor Directive Error? 【发布时间】:2016-04-29 21:24:49 【问题描述】:

我最近在 Unity 中使用 #region、#endregion、#if、#endif 等内容时遇到问题。

我不记得具体是从哪个版本的 Unity 开始的,但是每当我创建一个新项目时,我根本无法使用区域。

它总是说有一个解析错误,然后说类似这样的“error CS1027: Expected `#endif' directive

为了得到那个错误,这就是我放的全部

#if !UNITY_EDITOR
#endif

不管我是在语句之​​间包含代码,还是去掉指令两侧的所有空白空间..

我有另一个较旧的项目,我可以很好地使用 #regions 和 #if 语句,但不确定发生了什么变化或如何修复它。我一直在谷歌搜索解决方案,似乎没有人否则有这个问题吗?它是monodevelop的设置吗?白色空间?某处有无效字符?我真的不知道为什么会这样,这让我很生气,哈哈。

如果有人有任何建议,我很乐意听取他们的意见!

感谢您的宝贵时间!

编辑: 这是一个#regions 在拖放脚本中不适合我的示例。(奖励,免费拖放脚本!大声笑)如果它们给你错误,也许只是注释掉这些区域。我不得不这样做。 :(

Unity 控制台错误:

Assets/Scripts/DragAndDrop.cs(12,254): error CS1028: Unexpected processor directive (no #region for this #endregion) Assets/Scripts/DragAndDrop.cs(14,45): error CS1028: Unexpected processor directive (no #region for this #endregion) ...等

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// DragAndDrop.
/// This class will be responsible for listening to drag
/// events on the gameobject.
/// It will handle what happens during each drag state.
/// </summary>

public class DragAndDrop : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerDownHandler, IPointerUpHandler
public RectTransform canvas;        // the uGui canvas in your scene

#region DRAG BOOLEANS
public bool canDrag = true;         // can this object be dragged?
public bool wasDragged = false;     // was this object recently dragged?
public bool isDragging = false;     // is object currently being dragged
public bool dragOnSurfaces = true;  
#endregion

#region SWIPE
public float comfortZoneVerticalSwipe = 50;     // the vertical swipe will have to be inside a 50 pixels horizontal boundary
public float comfortZoneHorizontalSwipe = 50;   // the horizontal swipe will have to be inside a 50 pixels vertical boundary
public float minSwipeDistance = 14;             // the swipe distance will have to be longer than this for it to be considered a swipe

public float startTime;     // when the touch started
public Vector2 startPos;    // where the touch started
public float maxSwipeTime;  // if the touch lasts longer than this, we consider it not a swipe
#endregion

#region PRIVATE
private GameObject draggingObject;
private RectTransform draggingTransform;
#endregion

#region UNITY CALLBACKS
void Awake()
    canvas = GameObject.Find("Canvas").GetComponent<RectTransform>();

#endregion

#region TOUCH EVENTS
public void OnPointerDown(PointerEventData eventData)
    if(canDrag)
        wasDragged = false;
        // make sure object is parent to the canvas or it will disappear when picked up
        // I had to do this in word addiction because the letters were parented to tiles
        gameObject.transform.SetParent(canvas);
        // scale up when touched
        gameObject.transform.localScale = new Vector3(2, 2, 2);
    


public void OnPointerUp(PointerEventData eventData)
    if(canDrag)
        // scale back down
        gameObject.transform.localScale = new Vector3(1, 1, 1);
    

#endregion

#region DRAG EVENTS
public void OnBeginDrag(PointerEventData eventData)    
    if(canDrag)
        // start listening for swipe
        startPos = eventData.position;
        startTime = Time.time;

        // set drag variables
        isDragging = true;
        wasDragged = true;

        // run pick up logic
        PickUp(eventData);
    


public void OnDrag(PointerEventData eventData)
    if(canDrag)
        if(draggingObject != null)
            Move(eventData);
        
    


public void OnEndDrag(PointerEventData eventData)
    if(canDrag)
        // swipe detection
        bool shouldFlick = false;
        float swipeTime = Time.time - startTime;
        float swipeDist = (eventData.position - startPos).magnitude;
        if (swipeTime < maxSwipeTime &&
            swipeDist > minSwipeDistance)
            shouldFlick = true;
        
        // handle swipe/dropping
        if (shouldFlick)
            Debug.Log("FLICK");
        else
            isDragging = false;
            Place();
        
    

#endregion

#region EVENT FUNCTIONS
void PickUp(PointerEventData eventData)
    draggingObject = gameObject;
    Move(eventData);


void Move(PointerEventData eventData)
    if(dragOnSurfaces && eventData.pointerEnter != null && eventData.pointerEnter.transform as RectTransform != null)
        draggingTransform = eventData.pointerEnter.transform as RectTransform;
    

    var rt = draggingObject.GetComponent<RectTransform>();
    Vector3 globalMousePos;
    if(RectTransformUtility.ScreenPointToWorldPointInRectangle(draggingTransform, eventData.position, eventData.pressEventCamera, out globalMousePos))
        rt.position = globalMousePos;
        rt.rotation = draggingTransform.rotation;
    


void Place()
    Vector2 pos = new Vector2(transform.position.x, transform.position.y);
    Collider2D[] cols = Physics2D.OverlapCircleAll(pos, 10);
    float closestDistance = 0;
    GameObject closest = null;
    foreach(Collider2D col in cols)
        if(col.tag == "SomeTagToCheckFor")
            Vector2 otherPos = new Vector2(col.transform.position.x, col.transform.position.y);
            if(closest == null)
                closest = col.gameObject;
                closestDistance = Vector2.Distance(pos, otherPos);
             else
                // here we will check to see if any other objects
                // are closer than the current closest object
                float distance = Vector2.Distance(pos, otherPos);
                if(distance < closestDistance)
                    // this object is closer
                    closest = col.gameObject;
                    closestDistance = distance;
                
            
        
    

    // snap to the closest object
    if(closest != null)
        // if something was detected to snap too?
     else
        // return object back?
    

#endregion

【问题讨论】:

如果当前 VS 配置是“发布”,则切换到“调试”。 你好!谢谢回复。我正在使用 Monodevelop,它目前已设置为调试!谢谢你的想法。 嘿乔!是的,在控制台中,是的,我正在努力获取一个示例。您发布的答案对我来说很好,即使现在在较新的项目中也是如此。但奇怪的是我经常使用这些指令,很多,我喜欢区域组织我的代码。在以前的项目中,它们根本不起作用,但我做了一个新项目在 Unity 5.3.2f1 中进行测试,现在区域似乎工作正常?我现在举几个例子。 快速说明:它们不是“区域”。他们预处理指令。 #region 是另外一回事,只是为了组织代码。 酷!我不知道该怎么称呼它们,我以为它们都属于同一个名字,因为它们使用了“#”,我的无知!谢谢! :) 【参考方案1】:

所以,关于您给出的示例。

我将它粘贴到一个普通 Unity5 项目中的文件HybFacebookExtensions.cs 中。它运行良好 - 没有错误。

您的 Unity 安装可能存在问题。

不幸的是,没有人能够猜出那里出了什么问题。你手头有第二台机器可以测试吗?


#if !UNITY_EDITOR
Debug.Log("YO");
#endif

是一个正确的例子。

您可能不小心从 Debug 更改为 Release。

注意。你可能会很困惑地得到这些错误,

如果您的代码只有简单的语法错误。

这很烦人。以下示例可能会导致此类异常错误:

public Class Teste()

.. you meant to put it in here ..

#if UNITY_EDITOR
#endif

【讨论】:

好的,所以我要发布一些 pastebin 脚本。这是我从一位正在研究将 facebook 集成到独立统一构建中的绅士那里得到的脚本。这是他的脚本之一pastebin.com/HN43ZjEM。我对错误所说的位置和实际位置做了一些计算。 Unity 有时也会有问题将我指向正确的路线。 好的!谢谢,我会这样做的!我需要快速跑腿,大约 15 分钟后我会回来,我打开了我的 Game Jam 项目,在那里我也遇到了问题,我将提供更多示例。再次感谢您的时间,我非常感谢所有的帮助!我想确定这个问题是什么。 你很可能是对的。不知道还有什么可能。我发布了一个拖放脚本,在我的问题中给了我#region 错误。真正奇怪的是 - 与区域相同的代码在不同的项目中完美运行。但是当我把那个代码放到一个新的统一项目中时,我得到了所有这些错误。我很失落。 :(

以上是关于Unity预处理器指令错误?的主要内容,如果未能解决你的问题,请参考以下文章

子弹物理源代码未在 x86 中构建 - Visual Studio 2017 中的预处理器指令错误

在模块中找不到 (1) 中引用的非法预处理器指令和符号

如何在 Unity3D 的 c##error 预处理器中打印 URL?

#error 预处理器指令中带有撇号的警告

#define 预处理器指令可以包含 if 和 else 吗?

预处理器指令