我正在研究和学习Unity 5,UNET和网络的一些基础知识.我制作了一个简单的3D游戏,你可以四处走动并改变物体的颜色.但我现在想让它成为多人游戏,而且我在如何通过网络发送更改方面遇到了很多麻烦,因此所有玩家都可以看到单个玩家的颜色变化.
部分问题是使用较新的UNET网络引擎很难找到答案.有时我会遇到旧方式的答案.
所以主要的问题是,如何联网非玩家GameObject属性的变化?颜色,形状,大小等.
这是我现在的一些代码 - 我有很多不同的版本,所以我只发布当前版本:
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Player_Paint : NetworkBehaviour {
private int range = 200;
[SerializeField] private Transform camTransform;
private RaycastHit hit;
[SyncVar] private Color objectColor;
[SyncVar] private GameObject objIdentity;
void Update () {
CheckIfPainting();
}
void CheckIfPainting(){
if(Input.GetMouseButtonDown(0)) {
if (Physics.Raycast (camTransform.TransformPoint (0, 0, 0.5f), camTransform.forward, out hit, range)) {
string objName = hit.transform.name;
CmdPaint(objName);
}
}
}
[ClientRpc]
void RpcPaint(){
objIdentity.GetComponent<Renderer>().material.color = objectColor;
}
[Command]
void CmdPaint(string name) { …Run Code Online (Sandbox Code Playgroud) 基本上我有一个旋转的物体.它是一种单击和拖动类型的旋转,但是当对象面向-z -x角或左下角时,再次单击时,它有可能以相反的方式完全翻转180度.这非常麻烦,我甚至知道这发生了什么.这是点击代码:
void OnMouseDown()
{
Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
pos = Input.mousePosition - pos;
baseAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
baseAngle -= Mathf.Atan2(transform.right.y, transform.up.x) * Mathf.Rad2Deg;
startRotation = transform.rotation;
}
Run Code Online (Sandbox Code Playgroud)
baseAngle - = Mathf.Atan2(transform.right.y,transform.up.x)*Mathf.Rad2Deg;
^^^这条线让我头疼.我尝试使用".x"和".z"结尾,但我无法理解.当我用".z"切换".x"时,问题就出现在右下角.如果我甚至搞砸了".y",我只能远离我想要的东西.
图片:

顺便说一句,Z轴垂直向上,X轴水平向右.任何帮助赞赏.
我是C#/ Unity的新手(温柔) - 我正在尝试创建自己的脚本,向Inspector添加一个公共变量,这样我就可以让一个脚本适用于多个GameObjects(或者我认为).
脚本非常简单.
它适用于PC,但它不适用于Android.
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.EventSystems;
public class BtnLoadScene : MonoBehaviour {
public Object SceneObj;
private string SceneName;
public void LoadLevel()
{
SceneName = SceneObj.name;
Debug.Log (SceneName);
SceneManager.LoadScene(SceneName);
}
}
Run Code Online (Sandbox Code Playgroud)
我将此脚本作为组件附加到驱动场景加载的所有按钮(在整个应用程序中).同样,这里的值是我可以将我的"场景"从assets文件夹拖到检查器/组件中(因此我不必显式管理"整数"或"字符串" - 它将全部通过对象引用).
再次,这适用于PC UPDATE:根据评论中的建议,我在独立播放器中尝试了这个并且它失败了.这仅适用于Unity编辑器.当我为Android构建时(是的它编译并且我可以安装APK)它不起作用 - 第一个场景加载,按钮响应我的触摸,我看到它"压下",但亚行抛出:
12-23 15:37:27.028 14816 14847 I Unity : NullReferenceException: Object reference not set to an instance of an object
12-23 15:37:27.028 14816 14847 I Unity : at BtnLoadScene.LoadLevel () [0x00000] in <filename unknown>:0
12-23 15:37:27.028 14816 …Run Code Online (Sandbox Code Playgroud) 我编写了一些代码来获取StreamingAssets中文件夹内的所有文件夹,然后获取该文件夹中的所有文件.它在Windows上运行良好,但我无法在Android上运行它.
这是代码:
foreach (string s in Directory.GetDirectories(model.path + "/Levels")) {
GameObject el = (GameObject)Instantiate(listButton, Vector3.zero, Quaternion.identity);
el.transform.SetParent(grid1.transform);
string[] words = s.Split('/');
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
words = s.Split('\\');
#endif
el.GetComponentInChildren<Text>().text = words[words.Length - 1];
el.GetComponent<Button>().onClick.AddListener(() => {
MapSizeButtonClick(Int32.Parse(el.GetComponentInChildren<Text>().text));
});
}
Run Code Online (Sandbox Code Playgroud)
由于'\',我不得不为Windows添加#if UNITY_STANDALONE_WIN.
然后对于该文件夹中的文件,我写了这个:
foreach (string s in Directory.GetFiles(model.path + "/Levels/" + model.mapSize + "/" + model.colorNumber)) {
string[] words = s.Split('/');
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
words = s.Split('\\');
#endif
words = words[words.Length - 1].Split('.');
if (words[1] == "json") {
GameObject …Run Code Online (Sandbox Code Playgroud) 对于部署到Android设备的应用,如何在Unity中以编程方式将显示设置为立体?
我想要一个UI菜单,用户可以在"VR模式"和普通模式之间切换.我默认不想要VR模式,因为它应该是运行时的选项.我知道在构建设置中有"虚拟现实支持"的设置,但同样,我不希望默认启用此功能.
Unity中是否有一种方法可以在不使用UI层的情况下创建简单的2D按钮.我有一个有很多按钮的游戏,我不想在UI中制作整个应用程序.还欢迎更多控件:开关,滑块等.
PS.我看到了NGUI,到目前为止我还不喜欢它.还要别的吗?
我试图将我的所有非Unity特定代码移动到不继承的类中MonoBehaviour,类似于此.我Models为所有非MonoBehaviour类创建了一个单独的Visual Studio项目,并将该项目添加到Visual Studio解决方案中.但是,我无法Models通过Visual Studio向我的Unity项目添加对项目的引用(当我单击Unity项目时,Add Reference按钮不存在,我已经读过Unity无论如何都会自动重建它的Visual Studio项目,所以任何添加的引用都会丢失),所以我将Models.dll 的输出位置设置为Unity中的Assets文件夹,然后我将.dll添加到Unity的Project视图中.这一切都奏效了.问题是每当我重建我的Models项目时,Visual Studio中的Unity项目似乎都没有获取更改,所以我必须从Unity的Project视图中删除.dll并在每次我做任何时重新添加它.对Models项目的更改.
有没有办法让Visual Studio自动查看我的Models.dll 的更改,还是有更好的方法让我的Unity项目引用另一个Visual Studio项目?
我正在用C#构建一个Unity3D客户端,用于我制作的多人游戏.服务器是用Node.js编写的,我用Javascript编写了一个运行良好的Web客户端.但是我的Unity3D客户端实现遇到了滞后问题.我正在使用websocket-sharp库,但是无法像我在带有HTML5 Websocket类的Javascript客户端上那样使用它.我相信问题在于websocket-sharp库的制作方式,目前每个Send()都会导致锁定_forSend,因此数据将像这样传输:
data1:frg1
data1:frg2
data2:frg1
data2:frg2
...
Run Code Online (Sandbox Code Playgroud)
但是在我的工作javascript实现上,它看起来像这样,因为它是真正的多线程:
data1:frg1
data2:frg1
data2:frg2
data1:frg2
Run Code Online (Sandbox Code Playgroud)
因此,我认为这是我的C#Unity实现滞后的原因,因为websockets-sharp库的行为就像这样.任何人都可以确认这是websockets-sharp库的问题或建议一个可以工作的库吗?
我想在统一引擎中开发本机android应用程序,并且不需要使用物理,是否有可能为特定项目统一禁用物理引擎.
unity5 ×10
c# ×7
unityscript ×2
android ×1
assets ×1
directory ×1
monodevelop ×1
multiplayer ×1
unity3d-ui ×1
websocket ×1