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

unity坦克大战(二)(代码修改后)

2013-09-05 23:50 246 查看
之前将Mytank角色做好,那么剩下的是就要做Enemytank这个角色,这个角色有自动寻找Mytank并攻击的效果。

首先建立一个名为enemytank的cube调整大小并在cube正前方放一个名为firepoint的GameObject  Empty对象作为enemytank的子物体。这个脚本我用js(网上的),本来用c#改写了,感觉没有错,但是不知道怎么回事总是报错很是郁闷(之后再改改,估计是一些小问题),js版本的代码就是:

var Enemy_tank: GameObject; //定义坦克

var firepoint: Transform; //定义开火点

var bullet: Rigidbody; //定义子弹

var bullspeed: int=50; //定义子弹速度

var attackRange = 10.0; //定义距离

var target : Transform;//定义共计目标

//static var value : float ;

private var cun_time: int=0;

function Start () //初始化目标

{

if (target == null && GameObject.FindWithTag("Mytank")) target = GameObject.FindWithTag("Mytank").transform;

}

function Update () 

{

Enemy_tank=GameObject.Find("Mytank"); //实例化

if (target == null)

return;

if (!CanSeeTarget ())

return;

// Rotate towards target

var targetPoint = target.position;

var targetRotation = Quaternion.LookRotation (targetPoint - Enemy_tank.transform.position,Vector3.up); //求出与目标之间的角度

Enemy_tank.transform.rotation = Quaternion.Slerp(Enemy_tank.transform.rotation, targetRotation, Time.deltaTime * 2.0); //旋转之角度与目标对齐

var forward = Enemy_tank.transform.TransformDirection(Vector3.forward);

var targetDir =Enemy_tank.transform.position-target.position; //求出2者之间的距离

if((Vector3.Angle(forward, targetDir) <10.0)||((Vector3.Angle(forward, targetDir) >-10.0))) //这边是自动开炮的效果

{

cun_time++;

if(cun_time==5)



var clone : Rigidbody;

clone = Instantiate(bullet, firepoint.transform.position, firepoint.transform.rotation);

clone.velocity = Enemy_tank.transform.TransformDirection (Vector3.forward*bullspeed);

cun_time=0;

}

}

if((Vector3.Distance(transform.position, target.position) < attackRange)) //发现目标而且在范围之内,开始追击目标

{

var targetPoint1 = target.position;

var targetRotation1 = Quaternion.LookRotation (targetPoint1 - transform.position,Vector3.up);

transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation1, Time.deltaTime * 1.0);

transform.Translate(Vector3.forward*0.05);

}

}

function CanSeeTarget (): System.Boolean //计算是否被发现

{

if (Vector3.Distance(transform.position, target.position) > attackRange) return false;

var hit : RaycastHit; if (Physics.Linecast (transform.position, target.position, hit))

return hit.transform == target; return false;

}

将脚本放到enemytank上,然后附加脚本的对象,将enemytank的firepoint放到firepoint上,预物体enemybullet放到Bullet上,Mytank放到target中然后运行游戏就可以看到追击Mytank的效果

代码修改:

using UnityEngine;

using System.Collections;

public class follow : MonoBehaviour {
public GameObject Enemytank;
public float enemyspeed=0.1f;
public Transform firepoint;
public Rigidbody bullet;
public int bulletspeed=50;
public float AttactRange=50;
public Transform Target;
private float cuntime=0;
void Start(){
if (Target==null&&GameObject.FindWithTag("Mytank"))
Target=GameObject.FindWithTag("Mytank").transform;
//这个可以不要,但你要报Enemytank脚本中的target设为Mytank

}
void update(){
if (Target==null)
return ;
if (!CanSeeTarget ())
return;
var TargetPoint = Target.position;
var TargetRotation = Quaternion.LookRotation (TargetPoint - Enemytank.transform.position,Vector3.up); //求出与目标之间的角度
Enemytank.transform.rotation = Quaternion.Slerp(Enemytank.transform.rotation, TargetRotation, Time.deltaTime * 2.0f); //旋转之角度与目标对齐
var forward = Enemytank.transform.TransformDirection(Vector3.forward);//前进
var TargetDir =Enemytank.transform.position-Target.position; //求出2者之间的距离

if((Vector3.Angle(forward, TargetDir) <10.0)||((Vector3.Angle(forward, TargetDir) >-10.0)))
{cuntime++;
if (cuntime ==50)
{
Rigidbody clone;
clone =(Rigidbody )Instantiate (bullet ,firepoint.position,firepoint.rotation);
clone.velocity=Enemytank.transform.TransformDirection(Vector3.forward*bulletspeed);
cuntime=0;
}
}

if(Vector3.Distance(transform.position ,Target.position)<AttactRange)
{
var targetPoint=Target.position;
var targetPotation1=Quaternion.LookRotation(targetPoint-transform.position,Vector3.up);
transform.rotation=Quaternion.Slerp (transform.rotation,targetPotation1,Time.deltaTime*1.0f);
transform.Translate(Vector3.forward*enemyspeed);
}
}
System.Boolean   CanSessTarget(){
if(Vector3.Distance(transform.position ,Target.position)<AttactRange)
return false ;
RaycastHit hit;
if (Physics.Linecast(transform.position, Target.position,out hit))
return hit.transform == Target; return
4000
false;
}

}






之前老出错,不知道要改什么地方,后来发现原来是一个数据的数据类型写错了1.0f写成1.0,少了个f ,数据类型错了参数穿不进去。

哎...........
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐