unity 跨平台平台,多少人在用解决方法

使用Multiplayer Networking做一个简单的多人游戏例子分析-2/3(Unity3D开发之二十六)
7. 在网络中控制Player移动
上一篇中,玩家操作移动会同时控制同屏内的所有Player,且只有自己的屏幕生效。因为咱们还没有同步Transform信息。
下面我们通过UnityEngine.Networking来实现玩家控制各自Player
打开PlayerController脚本添加命名空间UnityEngine.Networking
using UnityEngine.N
修改MonoBehaviour为NetworkBehaviour
public class PlayerController : NetworkBehaviour
在Update函数中添加如下方法
if (!isLocalPlayer)
最后你的PlayerController内容如下:
using UnityE
using UnityEngine.N
public class PlayerController : NetworkBehaviour
void Update()
if (!isLocalPlayer)
var x = Input.GetAxis(&Horizontal&) * Time.deltaTime * 150.0f;
var z = Input.GetAxis(&Vertical&) * Time.deltaTime * 3.0f;
transform.Rotate(0, x, 0);
transform.Translate(0, 0, z);
保存脚本回到Unity中选中Player prefab在Project面板中保持Player prefab为选中状态添加组件Network & NetworkTransform 保存工程
NetwZ喎"/kf/ware/vc/" target="_blank" class="keylink">vcmtUcmFuc2Zvcm3Tw9Pa1NrN+MLn1tDNrLK9y/nT0ENsaWVudNDFz6Kho7zTyc9pc0xvY2FsUGxheWVyxdC2z6Os1rvIw7Wxx7C/zbuntsuy2df3oaM8L3A+DQo8aDQgaWQ9"8-测试网络中多玩家移动">8. 测试网络中多玩家移动
同样Build一个Mac standalone application作为主机运行点击LAN Host作为主机开始游戏运行Unity,点击LAN Client作为另一个客户端加入游戏点击各自的WASD移动各自Player
9. 区分各自的Player
上面中两个Player外观一致,我们修改自己Player的颜色
打开PlayerController脚本添加OnStartLocalPlayer方法
public override void OnStartLocalPlayer()
GetComponent().material.color = Color.
最终PlayerController:
using UnityE
using UnityEngine.N
public class PlayerController : NetworkBehaviour
void Update()
if (!isLocalPlayer)
var x = Input.GetAxis(&Horizontal&) * Time.deltaTime * 150.0f;
var z = Input.GetAxis(&Vertical&) * Time.deltaTime * 3.0f;
transform.Rotate(0, x, 0);
transform.Translate(0, 0, z);
public override void OnStartLocalPlayer()
GetComponent().material.color = Color.
Build新的Mac版本,测试效果
关闭Mac版本,停止运行Unity,回到编辑状态
10. 给Player添加射击武器
创建一个Sphere GameObject 修改名称为&Bullet& 选中Bullet对象修改Transform (0.2, 0.2, 0.2) 添加组件Physics & Rigidbody 在Rigidbody属性中取消Use Gravity 拖拽Bullet到Project面板中,制作为Prefab 删除场景中Bullet 保存场景
下面修改PlayerController添加发射子弹
打开PlayerController脚本添加public变量bulletPrefab
public GameObject bulletP
添加子弹local发射点
public Transform bulletS
在Update中加入输入源
if (Input.GetKeyDown(KeyCode.Space))
添加Fire方法
void Fire()
// Create the Bullet from the Bullet Prefab
var bullet = (GameObject)Instantiate (
bulletPrefab,
bulletSpawn.position,
bulletSpawn.rotation);
// Add velocity to the bullet
bullet.GetComponent().velocity = bullet.transform.forward * 6;
// Destroy the bullet after 2 seconds
Destroy(bullet, 2.0f);
最终PlayerController如下:
using UnityE
using UnityEngine.N
public class PlayerController : NetworkBehaviour
public GameObject bulletP
public Transform bulletS
void Update()
if (!isLocalPlayer)
var x = Input.GetAxis(&Horizontal&) * Time.deltaTime * 150.0f;
var z = Input.GetAxis(&Vertical&) * Time.deltaTime * 3.0f;
transform.Rotate(0, x, 0);
transform.Translate(0, 0, z);
if (Input.GetKeyDown(KeyCode.Space))
void Fire()
// Create the Bullet from the Bullet Prefab
var bullet = (GameObject)Instantiate(
bulletPrefab,
bulletSpawn.position,
bulletSpawn.rotation);
// Add velocity to the bullet
bullet.GetComponent().velocity = bullet.transform.forward * 6;
// Destroy the bullet after 2 seconds
Destroy(bullet, 2.0f);
public override void OnStartLocalPlayer ()
GetComponent().material.color = Color.
保存脚本回到Unity
下面开始针对变化过的PlayerController修改Player Prefab
将Player Prefab拖拽到场景中保持Player prefab选中创建一个Cylinder圆柱体作为其Child 修改Cylinder名称为&Gun& 保持Gun被选中移除Capsule Collider组件设置Transform Position (0.5, 0.0, 0.5) 设置Transform Rotation (90.0, 0.0, 0.0) 设置Transform Scale (0.25, 0.5, 0.25) 设置Material为Black Material
最后Player效果:
保持Player选中状态创建一个empty GameObject作为Child 修改empty GameObject名称为&Bullet Spawn& 设置Bullet Spawn Position (0.5, 0.0, 1.0)
主要是将子弹发射点Bullet Spawn设置到枪口处
保持Player Prefab选中将Bullet prefab拖到PlayerController中的Bullet Prefab 框将Player的Child Bullet Spawn拖到PlayerController中的Bullet Spawn 框保存工程 Build新的Mac版本,并测试
你会发现空格键可以在各自场景中发射子弹,但是子弹没有出现在对方场景中。
关闭Mac版本停止Unity,回到编辑模式
11. 增加多人射击
下面我们会将Bullet prefab注册到NetworkManager
选中Bullet prefab在Project面板中保存Bullet prefab选中添加组件Network & NetworkIdentity 添加组件Network & NetworkTransform 设置NetworkTransform中Network Send Rate为0
子弹不会中途改变方向,所以我们不需要每帧更新位置,每个客户端自己计算Bullet坐标信息,所以将Network Send Rate设置为0,网络不需要同步坐标信息。
选中NetworkManager在Hierarchy面板中保持NetworkManager选中展开Spawn Info 点击Registered Spawnable Prefabs右下角+
将Bullet Prefab加入到Registered Spawnable Prefabs中
打开PlayerController脚本
注意[Command]可以声明一个函数可以本客户端调用,但是会在服务端(主机)执行。
添加[Command]给Fire函数修改Fire函数名称为&CmdFire&
void CmdFire()
Update函数中修改调用为CmdFire
CmdFire();
在CmdFire函数中添加NetworkServer.Spawn方法来创建bullet
NetworkServer.Spawn(bullet);
最终PlayerController如下:
using UnityE
using UnityEngine.N
public class PlayerController : NetworkBehaviour
public GameObject bulletP
public Transform bulletS
void Update()
if (!isLocalPlayer)
var x = Input.GetAxis(&Horizontal&) * Time.deltaTime * 150.0f;
var z = Input.GetAxis(&Vertical&) * Time.deltaTime * 3.0f;
transform.Rotate(0, x, 0);
transform.Translate(0, 0, z);
if (Input.GetKeyDown(KeyCode.Space))
CmdFire();
// This [Command] code is called on the Client &
// & but it is run on the Server!
void CmdFire()
// Create the Bullet from the Bullet Prefab
var bullet = (GameObject)Instantiate(
bulletPrefab,
bulletSpawn.position,
bulletSpawn.rotation);
// Add velocity to the bullet
bullet.GetComponent().velocity = bullet.transform.forward * 6;
// Spawn the bullet on the Clients
NetworkServer.Spawn(bullet);
// Destroy the bullet after 2 seconds
Destroy(bullet, 2.0f);
public override void OnStartLocalPlayer ()
GetComponent().material.color = Color.
保存脚本回到Unity Build新版本Mac,测试
此时应该可以看到子弹同步到了每个玩家场景中
关闭Mac版本停止运行Unity,回到编辑模式
添加玩家生命值
给Bullet Prefab添加一个新脚本&Bullet& 打开Bullet脚本添加碰撞函数
using UnityE
using System.C
public class Bullet : MonoBehaviour {
void OnCollisionEnter(Collision collision)
Destroy(gameObject);
此时子弹碰撞到Player之后自动销毁
添加玩家生命值
- 给Player prefab添加一个新脚本&Health&
Health脚本如下:
using UnityE
public class Health : MonoBehaviour
public const int maxHealth = 100;
public int currentHealth = maxH
public void TakeDamage(int amount)
currentHealth -=
if (currentHealth &= 0)
currentHealth = 0;
Debug.Log(&Dead!&);
在Bullet中增加击中受伤
修改Bullet中的OnCollisionEnter函数
using UnityE
using System.C
public class Bullet : MonoBehaviour {
void OnCollisionEnter(Collision collision)
var hit = collision.gameO
var health = hit.GetComponent();
if (health
health.TakeDamage(10);
Destroy(gameObject);
添加一个简易的玩家头顶血条
在场中中创建一个UI Image 修改Canvas名称为&Healthbar Canvas& 修改Image名称为&Background& 保存Background选中设置RectTransform Width 100 设置RectTransform Height 10 修改Source Image 为 built-in InputFieldBackground 修改 Image Color 为红色不要修改Background的中心点和锚点复制一份Background 修改复制出来的Background名称为Foreground 将Foreground设置为Background的Child 将Player prefab拖到场景中
将Healthbar Canvas拖到Player中作为Child
整个Player结构如下:
选中Foreground
设置Foreground Image为绿色
将Foreground 中心点和锚点修改为Middle Left(用于血条从左到右填充)
选中Healthbar Canvas
点击RectTransform设置按钮(小齿轮)中的Reset 设置RectTransform Scale (0.01, 0.01, 0.01) 设置RectTransform Position (0.0, 1.5, 0.0) 选中Player,点击apply,保存Player Prefab 保存场景
修改Health脚本,控制血条
最终Health脚本如下:
using UnityE
using UnityEngine.UI;
using System.C
public class Health : MonoBehaviour {
public const int maxHealth = 100;
public int currentHealth = maxH
public RectTransform healthB
public void TakeDamage(int amount)
currentHealth -=
if (currentHealth &= 0)
currentHealth = 0;
Debug.Log(&Dead!&);
healthBar.sizeDelta = new Vector2(currentHealth, healthBar.sizeDelta.y);
保存脚本回到Unity 保持Player选中将Foreground拖到Healthbar输入框中
apply Player prefab 删除场景中的Player 保存场景
最后,修改Healthbar永远朝向主摄像机
- 给Player prefab中的Healthbar Canvas添加新脚本&Billboard&
Billboard脚本如下:
using UnityE
using System.C
public class Billboard : MonoBehaviour {
void Update () {
transform.LookAt(Camera.main.transform);
编译新Mac版本,测试
你会发现血条只在本地变化了,没有同步到所有玩家。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'想知道有多少人使用过Unity3D的刚开始学,想请教一些学过的人一些问题。QQ:--------------------------------------------------------------路过,没有用到过这款------解决方案--------------------------------------------------------没有用过,没有听过。------解决方案--------------------------------------------------------网上下的到
效果蛮不错的
但是不会用的几个北欧青年不堪游戏引擎商压迫,开发了闻名的 unity3d
GDC 2014 之后,游戏引擎市场会有怎样的变化?
康与缨,虚拟现实从业
游戏引擎市场近几年的变化是比较大的 显著的特征是手持端的兴起对引擎的冲击,早前的游戏引擎真正市场化的是 unreal,走的商业模式针对大是型游戏公司的,即大公司购买授权号(巨贵 几十万刀吧)进行开发,买不起的自己玩去。
对于小型的游戏公司,会采取低价策略(几万刀吧)加上分成协议,也就是引擎商根据你们游戏的销量抽成,那样万一有一匹黑马公司突然上位,游戏引擎开发商 (主要也就是 Epic) 跟着捞一票。
那微型公司或者个人开发者呢,一般就用不起 unreal 这类的高贵引擎,会考虑 Ogre 或者自己就是技术大牛便自己 DIY 开发一款(游戏程序员以自己开发引擎为荣是很长时间以来一直有的风气,那开发的如何另论吧,有激情总是好的么)
不过,不过之前的话大家都可以当空气对不对。
不过后来出现了搅局者, 这个搅局者就是大家众所周知的 unity3d, 没有它 ,就没有现在的 udk,或者 cryengine 的个人版本,
据说故事是这样的,有几个北欧乡下的吊丝青年,也就是上面说的小公司或者说 indie 开发者,不堪高大上游戏引擎商的无视和凌辱,决定为了第三世界的游戏开发者们为了亚非拉的屌丝游戏人们站出来,开发一款英特纳熊耐儿的游戏引擎,让全世界的无产者们联合起来,过上性福的日子。
当然事后怎么吹随便他们,反正他们现在一片光明,牛的不得了,but,当时未必真是这样,unity 早期版本是仅有 mac 的,而且看着也特别怪异,主要应用是拿来做虚拟现实,那 mac 下面的虚拟现实有个毛毛用啊,所以也没多少人用起。不过早期由于在 mac 下面的软件都充满了自己是设计师的优越感的自觉,在界面设计上 unity3d 不知是否受到此风影响,非常的简洁易用, 这种基因到现在依然存在,用 unity 开发是非常顺畅少滞涩感的,总觉得那个按键就是应该在这里。
在默默无闻的版本一之后就是业界大事件, unity2.0 的出现,这个奇葩引擎的升级给整个业内带了了巨大的冲击,因为它不仅仅是支持了 win mac 的跨平台开发(也就是你的工程文件直接拷贝到任何一个平台下双击打开就可继续开发)而且开始支持 ios 和 android 的操作系统,这一非常富有远见的功能整合,为 unity 的崛起奠定了基础
来说说 unity2.0 出现之前那些其他的游戏引擎们都在干啥,当时的业内风向,是觉得 PC 端游戏最高,Cryengine 代表业内引擎最高画面质量未来无限好像樱木花道,Unreal 代表次世代游戏工业标准大约就是流川枫,其他游戏引擎如 ogre,renderware,gamebryo 都是类似樱木三人组的等等!
Bigworld 这类网络功能较好但是画面普通的优秀引擎也是依然要被两大豪门们鄙视的
&天天搞个破网络,画面也不搞搞好,像个什么样子!你说 为啥不好好学习&
再或者说强劲的 in stuido engine 如 forestbite 或者顽皮狗的引擎 小岛的 fox 啥的也就是藏在深闺默默挣钱,毕竟程序员用的引擎和商业化的 engine 是不一样的,很多厉害的引擎功能再强外人也是用不起来,就是个窝里横,然后哪些 PS 或者 XBOX 上 Wii 上的开发也都是各种公司各种玩法,所以商业市场上主要就是流川樱木和等等们,
但是还有水户洋平呢,unity3d 是一家眼光非常长远的公司,每次的新功能发布看上去都有些遮遮掩掩的欲语还休,其实目标很明确。unity2.0 标榜自己跨平台,但是其实是对 android 和 ios 的手游市场产生了兴趣,当然这些是在他所谓全平台支持的战略下进行,它试图通过一个工程文件,一次性无痛的发布包括 ios android xbox wii ps3 在内所有的平台,(真正做到是 unity3.0 时代的事情),但当时已经对所以游戏开发者造成巨大的震撼,大家都意识到以 unity3d 这样方便的开发工具,如果能够一次开发就针对所有平台进行发布,是非常有吸引力的,而且 unity 的价格仅仅是基本版 1w5 人民币,针对每个发布平台再加 1w5 人民币即可。
同时,提供了独立游戏开发者功能稍微受限制的免费开发版本,一时间所有游戏开发者都把目光投向 unity,即使那时候 unity 的画面和技术都不能和 cryengine 和 Unreal 比,但是他易于开发的特性,多平台无缝切换和发布的功能,以及非常廉价的价格,加上公司 CEO 吹嘘的&民主化的引擎!& 造成的社会影响是 ----
-unity3d 是民主的 美好的 三个代表的, cryenigne 和 unreal 变成了特权阶层和陈腐贵族阶层的代名词,当年的社会舆论一边倒的给 unity 奉上最美好的褒奖和恭维,unity 俨然就是明日之星,而他后续开发的版本 3.0 4.0 也不孚众望的改进了动画系统和渲染,寻路,场景优化 等对于独立游戏开发者们颇为头痛的问题,继续得到大家的追捧(大家都不想做的事情算是 unity 帮你开发完了)
回头来看看樱木和流川,突然发现没人来找他们打波了,大家居然都去请水户洋平,开始当然一声冷笑,看他出场费那么低,有什么了不得,但是越往后越觉得不对劲,所有的单子都跑去水户洋平那里了,两位大佬天天坐板凳,其他的等等们更是没了活路,这才发现水户心气平,球技好还收钱少,成了都教授万众瞩目还不骄不馁,俨然是要取而代之的意思,看来以自己的价格,再没人请来打球了。
于是,UDK(unreal development kit)开始出现了,这种表面上娇滴滴的说我们只是给独立开发者玩玩拉的姿态,其实就是考虑自己身价太高,一般人接受不起,索性学习 unity 战略,走低价免费授权,抢占市场,心里已然是服了软,crytek 很快也采取了类似的策略。 收效。。。 其实勉强, 毕竟是没法子脱了高大上的外套跳进坑里和 unity 肉搏,赢之也已湿身,输了就没底裤了,反正不好看相。
回到今年,现在的状态是 Unreal 和 Cryengine 都闭口不谈 unity,假装两贵族决斗,米有 unity 你个草民的事情,其实心里都想着 unity 的手机市场,斜眼看着又拿不到,还不能说破,心痒难耐,但是嘴巴上只是说&喝, 哈哈哈 ,unreal,你这招落的下风, 嘿! 你 cryeninge 内力不足了吧",Unity 就在旁边蹲着嗑瓜子毫无形象,没事过来踢他们屁股一下,只做没看见,强挺贵族风范。
所以今年的状态是 unreal 和 cryeninge 都推出了 19 美金和 9 美金的包月套餐,来对抗 unity5(他们不会说是对抗 unity 的 嘘) 咳咳 对抗对方。试图在自己几乎完全失去的手机市场站稳脚跟,毕竟未来市场是手持端的。
Unity 呢,其实毫不寂寞,所谓樱木流川他都没有看着眼里,野心藏了好多年现在终于有资本干大的,可以图穷匕见了,最终目的是仙道! 业内小霸王的adobe ! 终于在预谋了多年之后推出了webgl的支持,
html5 阵营一直不能完全取代 flash 的原因就是缺乏优良的编辑器,而且 unity 终于介入这全新领域,站在一帮早对 adobe 看不太顺眼的手机大佬鞍前 ,对 flash 市场造成严重的威胁,身后是 unreal 和 cryengine 抢自己剩下的饭粒,呵呵.....
adobe 正在仰望星空 不知道在想啥,也不知道意思到了没
对了 在旁边的角落里面 有个叫 coco2d 的胖子冷眼吃肉。

我要回帖

更多关于 unity 判断平台 的文章

 

随机推荐