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 中的预处理器指令错误
如何在 Unity3D 的 c##error 预处理器中打印 URL?