因为要得找工作了,不得不写些文章让HR更多的了解到我,同时能帮到别的同学也是好的。因为接触Unity时间不是特别久,所以这里先帖出早期开发的C#游戏,然后再帖Unity游戏。
另外提醒,我的所有作品都是自己开发的,绝无抄袭(程序代码和编程思想绝没超抄过别人的),最多也就是高仿别人的游戏(贪吃蛇算吗?俄罗斯方块算吗?炸弹超人算吗?五子棋算吗?)。
转载请标明出处!!Power by 辣椒皮儿塞牙了╮
C#终于写完了,这几天拼着老命在写,好几万字呢啊,手都软了。没办法,想去上海学Unity技术,拼一拼值了。
大概说下我的Unity状况,大三下一个偶然的机会才接触到Unity,然后就毅然决然的放弃了本身已经走上正轨的.Net路线(我都已经做过好几个项目的,赚了好几千大洋!!),转向Unity,悲剧的是我身边没有一个人懂这个技术,甚至连游戏方向的都没有,只能自己摸索。从.Net跨到Unity,有着太多的不适应,随便一个小问题就能把人逼疯,磕磕绊绊,进步缓慢,真的很希望能有一个人,一个公司带我一下,那怕工资少点我也愿意。现在嘛,基础的使用都会了,写个FPS游戏还是不成问题的;RPG游戏,人物走跑跳放技能,技能粒子特效,技能伤害判定这些都可以。这两天在学习NGUI,常用控件事件响应可以做出来。
游戏说明:
1.这是我第一次接触Unity后第10天的一个小作品,虽然现在看来简单的没脸拿出来晒,但毕竟是曾经里程碑、历史性的一刻
2.整个地形都是官方自带的资源包里的内容,画画地形图,种种树,涂涂草一个场景就好了。开启了Fog,没敢开阴影,开了好卡。
3.坦克是我下载的一个FBX模型,外边加了一个Cube检测碰撞。控制我做的比较特别,W/S前后走,A/D左右转,Input.GetAxis("Mouse X")或左右键是炮塔的水平旋转,Input.GetAxis ("Mouse Y")或上下键是炮管垂直旋转,用了鼠标来瞄准就比较精准了,Fire1开火,打出去一个被拉长的球体的预设。。炮弹撞击会有火焰和声音效果
4.敌人AI,用Random写的,思想有点类似我的“消灭星星(炸弹超人)”那篇文章里讲小黄星的思路。保存一下前进方向,大多数情况下都是按照这个方向移动,偶尔突然改变一下一下方向或者lookat一下玩家的坦克,距离达到一定值后会瞄准玩家并开火。当时才接触Unity,AI写的简单了点,现在写的话就可以写复杂点,尽量真实的模拟,或者增加趣味性
5.坦克初始有100颗炮弹和100的生命值,被攻击后减少生命值,见到0时坦克不能在被控制(就是死那了。。)
6.一个很麻烦的地方就是,如果坦克爬坡后,它的方向肯定是斜向上的,这时继续按“前”,那么坦克会飞起来,完全脱离了现实情况。所以要检测什么时候离开地面了,当时立马想到用CharacterController的碰撞器,但这样干肯定不行啊,爬坡时坦克压根没倾斜。。这也是当时一直没解决的问题。现在是知道了,可以用于地面的碰撞器,OnCollisionEnter和OnCollisionExit来判断,但要注意一下这样写还必须给坦克一个速度是属性,不然当坦克刚离开地面,立马停止感觉更怪。最最好的解决办法是用写赛车类游戏的那一套组建和思路来写坦克的控制
程序还是很简单的,代码就不拿出来丢人现眼了,欢迎交流。
算了,还是拿出来接受大家的洗礼吧。。
我方坦克控制:
using UnityEngine;
using System.Collections;
public enum State{Ctrl=0,Won,Lost};
public class TankCtrl : MonoBehaviour {
public static TankCtrl TC;
//炮弹
public Rigidbody projectile;
public float CannonballSpeed = 100;
public Transform CannonballPos;
//坦克移动
public float TankMoveSpeed=30;
public float TankRotateSpeed=60;
//炮塔
public GameObject Turret;
public float TurretRotateSpeed=20;
//炮管
public GameObject Gun;
public float GunRotateSpeed=30;
public int cntCannonball=100;
public int Life=100;
public State TankStste=State.Ctrl;
bool grounded=false;
void Start () {
TC = this;
TankStste = State.Ctrl;
Time.timeScale = 1.0f;//开始游戏
}
void Update () {
if (TankStste != State.Ctrl||grounded) {
return;
}
//前进后退
if (Input.GetKey (KeyCode.W)) {
this.transform.Translate (Vector3.forward * Time.deltaTime * TankMoveSpeed);
}
else if (Input.GetKey (KeyCode.S)) {
this.transform.Translate (Vector3.forward * Time.deltaTime * -TankMoveSpeed);
}
//左右旋转
if (Input.GetKey (KeyCode.A)) {
this.transform.Rotate (Vector3.up * Time.deltaTime * -TankRotateSpeed);
}
else if (Input.GetKey (KeyCode.D)) {
this.transform.Rotate (Vector3.up * Time.deltaTime * TankRotateSpeed);
}
//炮塔水平旋转
Turret.transform.Rotate(0, Input.GetAxis("Mouse X")*Time.deltaTime * TurretRotateSpeed, 0);
if(Input.GetKey(KeyCode.LeftArrow))
{
Turret.transform.Rotate(Vector3.up*Time.deltaTime*-TurretRotateSpeed*2);
}
else if(Input.GetKey(KeyCode.RightArrow))
{
Turret.transform.Rotate(Vector3.up*Time.deltaTime*TurretRotateSpeed*2);
}
//炮管垂直旋转
Gun.transform.Rotate(-Input.GetAxis ("Mouse Y") * GunRotateSpeed * Time.deltaTime,0, 0);
if(Input.GetKey(KeyCode.UpArrow))
{
Gun.transform.Rotate(Vector3.left *Time.deltaTime*GunRotateSpeed);
}
else if(Input.GetKey(KeyCode.DownArrow))
{
Gun.transform.Rotate(Vector3.left*Time.deltaTime*-GunRotateSpeed);
}
//开火
if( Input.GetButtonDown( "Fire1" )||Input.GetKeyDown(KeyCode.Space ) )
{
if (cntCannonball>0) {
cntCannonball--;
Rigidbody clone = (Rigidbody)Instantiate(projectile,CannonballPos.position, CannonballPos.rotation);
clone.velocity = CannonballPos.TransformDirection (Vector3.forward * CannonballSpeed);
Physics.IgnoreCollision( clone.collider, CannonballPos.root.collider );
}
}
}
public void Attacked()
{
Life -= Random.Range (10, 20);
if (Life<=0) {
Life=0;
TankStste=State.Lost;
}
}
void OnCollisionEnter( Collision collision)
//void OnCollisionEnter(Collider other)
{
//if (other.tag == "Terrain") {
if (collision.gameObject.tag=="Terrain") {
//grounded = true;
} else {
//grounded=false;
}
}
}
敌方坦克AI:
using UnityEngine;
using System.Collections;
public class AutoCtrl : MonoBehaviour {
public static AutoCtrl AC;
public Transform FirePoint;
public Rigidbody Bullet;
public float MoveSpeed = 10;
public float RotateSpeed = 60;
float rnd=0;
private GameObject hero;
public int cntCannonball=100;
public int Life=100;
public State TankStste=State.Ctrl;
void Start () {
AC = this;
TankStste = State.Ctrl;
Time.timeScale = 1.0f;//开始游戏
hero = GameObject.Find("MyTank");
transform.LookAt (hero.transform);
}
void Update () {
if (TankStste!=State.Ctrl) {
return;
}
if (rnd<1) {
transform.Translate(Vector3.forward*Time.deltaTime*MoveSpeed);
}
else if (rnd<2) {
transform.Translate(Vector3.forward*Time.deltaTime*-MoveSpeed);
}
else if (rnd<4) {
transform.Rotate(Vector3.left*Time.deltaTime*MoveSpeed);
}
else if (rnd<6) {
transform.Rotate(Vector3.left*Time.deltaTime*-RotateSpeed);
}
else if (rnd<15) {
if (cntCannonball>0) {
cntCannonball--;
Rigidbody clone = (Rigidbody)Instantiate(Bullet,FirePoint.position, FirePoint.rotation);
clone.velocity = transform.TransformDirection (Vector3.forward * 100);
RndInstructions();
}
}
else if (rnd<20) {
transform.LookAt (hero.transform);
if (Random.Range (0, 2)==0) {
rnd=0;// run to me
}
else{
rnd=14;//fire to me
}
}
if (Random.Range (0, 100)==0) {
RndInstructions();
}
}
void RndInstructions()
{
rnd = Random.Range (0, 20);
}
public void Attacked()
{
Life -= Random.Range (10, 20);
if (Life<=0) {
Life=0;
TankStste=State.Lost;
}
}
}