您的位置:首页 > 移动开发 > Unity3D

自制Unity小游戏TankHero-2D(1)制作主角坦克

2015-01-29 00:54 525 查看
自制Unity小游戏TankHero-2D(1)制作主角坦克

我在做这样一个坦克游戏,是仿照(http://game.kid.qq.com/a/20140221/028931.htm)这个游戏制作的。仅为学习Unity之用。图片大部分是自己画的,少数是从网上搜来的。您可以到我的github页面(https://github.com/bitzhuwei/TankHero-2D)上得到工程源码。

public class PushBackToField : MonoBehaviour {
Dictionary<Collider2D, Vector3> initialPositionDict;// = new Dictionary<Collider, Vector3>();

void Awake()
{
initialPositionDict = new Dictionary<Collider2D, Vector3> ();
}

void OnTriggerEnter2D(Collider2D other)
{
if (initialPositionDict.ContainsKey(other))
{
initialPositionDict[other] = other.transform.position;
}
else
{
initialPositionDict.Add(other, other.transform.position);
}
}

void OnTriggerStay2D(Collider2D other)
{
Push (other);
}

void OnTriggerExit2D(Collider2D other)
{
if (initialPositionDict.ContainsKey(other))
{
initialPositionDict.Remove(other);
}
}

void Push(Collider2D other)
{
Vector3 initialPosition = Vector3.zero;
if (initialPositionDict.ContainsKey(other))
{
initialPosition = initialPositionDict[other];
}
else
{
Debug.LogError(string.Format("{0} should have been added to the dict.", other.gameObject.name));
}

if ((initialPosition - other.transform.position).magnitude > 0.001f)
{
//Debug.Log("lerp push");
other.transform.position = Vector3.Lerp(other.transform.position, Vector3.zero, Time.deltaTime);
}
else
{
//Debug.Log("sudden push");
other.transform.position = initialPosition;
}
}
}


围墙
这个脚本对上下左右四个围墙都适用,以后有了别的形状的围墙,也仍然适用。这也是它的优点之一。

说到这个围墙的反弹,就涉及摄像机跟随的一个问题。实际上,围墙反弹时,如果玩家持续撞击围墙,会使玩家坦克产生快速的震动。此时摄像机也就跟着快速震动,这很影响体验。上文里将跟随速度设置得比较低时,这种震动就不会影响到摄像机。这是因为,摄像机反应慢,震动速度快,不等摄像机需要向左跟随,就又要向右跟随了,所以摄像机基本上就在原地不动了。

将上文的 catchingSpeed 调大一些,再持续去撞墙,你就会明白了。

光源

忘了说,要添加一个线光源,不然场景会很暗淡。下图就是没有添加光源的样子。





加上光源就成了这样:





显示文字

想显示上图所示的文字?用Unity最近推出的uGUI还是很舒服的(也可能是因为我没有学过nGUI等等的UI系统吧)。





点击Text后,会增加3个对象,Canvas,Text和EventSystem。





给Text对象添加一个DrawMouseInfo.cs的组件(名字无所谓)。

public class DrawMouseInfo : MonoBehaviour {
Text guiText;

void Awake()
{
guiText = this.GetComponent<Text> ();
}

void Update () {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit))
{
guiText.text = string.Format ("input: {0} mouse: {1} | {2}", Input.mousePosition, hit.point, hit.transform.gameObject.name);
}
else
{
guiText.text = string.Format ("input: {0} mouse: {1} | {2}", Input.mousePosition, "null", "null");
}
}
}


uGUI对象是可以在Scene视图里拖动的,只不过你要先找到它。





它的位置很奇葩,如上图所示,整个地图在它的Canvas脚下都很渺小。

快速自制贴图资源

本项目中的坦克、子弹、光标、背景图都是本人制作的,制作工具你猜猜?是PPT。





坦克底座是SmartArt图形里的。





轮子只是设置了一下渐变填充。





炮塔的圆形,把底座的圆形缩小一点就是。炮塔的炮管,是“形状”里的箭头,删掉凸起的尖的部分,调整一下锚点长短就OK。





背景用的是“纹理填充”,看到第二行第一个了没?





准星,用的是SmartArt里的“分离射线”。把四个箭头留下,其它内容删除。再把箭头的尾部顶点删除,左右交换位置,上下交换位置,上个色就成了。









还可以吧?

总结

您可以到我的github页面(https://github.com/bitzhuwei/TankHero-2D)上得到工程源码。

请多多指教~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: