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 ,数据类型错了参数穿不进去。
哎...........
首先建立一个名为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 ,数据类型错了参数穿不进去。
哎...........
相关文章推荐
- windows下运行voc-release3.1或4.1修改后的代码
- Vs2015 本地git获取的代码目录文件修改后,启动提示error:Unable to start program “C:\Program Files\dotnet\dotnet.exe” 已解决.
- android中修改framework层代码后怎样操作才能看到修改后的效果?
- webstorm vue代码修改后不更新问题
- 可以让myeclipse后台代码修改后不必重新部署的方法(注:不包括配置文件的修改)
- 测试代码块内容类型修改后会不会保存
- 做web项目时对代码修改后浏览器端不生效的应对方法(持续更新)
- ODOO 代码修改后,如何生效
- android代码修改后,回退更新
- 做web项目时对代码修改后浏览器端不生效的应对方法(持续更新)
- android中修改framework层代码后怎样操作才能看到修改后的效果?
- 做web项目时对代码修改后浏览器端不生效的应对方法
- 做web项目时对代码修改后浏览器端不生效的应对方法(持续更新)
- 客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值。
- 对原来的模块修改后,最好在解释器里把修改好的代码重新写再粘贴到py文件里,否则F5运行py模块时,总是出错误,如缩进不对 如for语句没写冒号 就导致cmd sdist和install 出错
- js代码从页面移植到文件中失效或js代码修改后不起作用的解决办法
- android中修改framework层代码后怎样操作才能看到修改后的效果?
- android中修改framework层代码后怎样操作才能看到修改后的效果?
- android中修改framework层代码后怎样操作才能看到修改后的效果?
- android中修改framework层代码后怎样操作才能看到修改后的效果?