java3d lookat,怎么让物体用侧面LOOKAT?

这篇博客详细介绍了Unity3D中一个敌人的AI行为树实现,包括追逐玩家、技能释放策略以及不同技能的执行逻辑。通过调整状态机和变量,实现了怪物根据与玩家的距离和状态进行不同行为的切换,如普通跟随、释放技能等。同时,还展示了如何控制怪物的旋转、速度和伤害范围,以增加游戏的挑战性和趣味性。
摘要由CSDN通过智能技术生成

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

var enemyNum:int;//猜猜我是谁?

var health:float;//我的血量

var EnemySpeed:float;//我的速度

var myscore:int;//我的分值

var distmin:float;//我的碰撞杀伤范围

var Enemycenter:Transform;//怪物旋转中心

private var mainCamera:Camera;

var comboTex : Transform;

//技能列表

var skill01:Transform; //麒麟跳

var skill02:Transform; //闪电

private var sarah : Transform;//sarah的位置

private var dist:float;

private var mytransform:Transform;

private var adduptime01:float = 0;

private var adduptime02:float = 0;

private var target : Vector3;//用于判断玩家位置是否发生变化

private var randomangle:int;//定义变量y,怪物随机转动角度的种子

private var randomtime:int;//随机时间种子

private var died:boolean = false;//我的死亡状态

private var destroyTime:float;//怪物自毁倒计时

var maxRadiansDelta:float;

private var maxRadiansDeltaFinal:float;

//private var skilling : boolean = false;

function Start () {

mainCamera = Camera.mainCamera;

maxRadiansDeltaFinal = maxRadiansDelta;

//怪的全局数量+1

//CreateEnemy.amount_enemy ++;这货是BOSS,暂时不要跟杂鱼一起统计

mytransform = gameObject.transform;

//获取并sarah角色为目标

sarah = GameObject.FindWithTag("sarah").transform;

//临时目标对齐玩家位置 怪物瞄准临时目标

target = sarah.position;

mytransform.LookAt(target);

randomtime = Random.value * 3;//给个sarah死亡后第一次变化角度的时间

}

var myState : int = 0;

function Update(){

dist = Vector3.Distance(sarah.position, mytransform.position);

switch(myState){

case 1://释放1号技能

Skill01();

break;

case 2://释放2号技能

Skill02();

break;

case 3://释放3号技能

Skill03();

break;

case 4://释放4号技能

Skill04();

break;

default://标准状态

if(dist<10 && dist>2){

adduptime01 += Time.deltaTime;

if(adduptime01 > randomtime){

myState = Random.Range(0,5);

adduptime01 -= randomtime;

randomtime = Random.value * 3;

}

}

Standard();

break;

}

}

//正常跟随AI

function Standard(){

//如果怪物与角色之间的距离大于distmin,则怪物继续前进

if(dist>distmin){

mytransform.Translate(0,0,EnemySpeed*Time.deltaTime);

playanim(Enemycenter);

}

//如果怪物与角色之间的距离小于distmin,则改变玩家全局变量死亡(died)为1

else if(!MoveAndFire.nohurt){

MoveAndFire.health -= 1;//如果目标不是无敌的,则伤血

MoveAndFire.hurt = 1;//角色进入受伤状态1

}

target = Vector3(sarah.position.x,0,sarah.position.z);

mytransform.forward = Vector3.RotateTowards(mytransform.forward,target - mytransform.position,maxRadiansDeltaFinal*Time.deltaTime,2*Time.deltaTime);

//防怪物转向过小。。。

if(dist > 10){

maxRadiansDeltaFinal = maxRadiansDelta*3;//增加转向速度

}else{maxRadiansDeltaFinal = maxRadiansDelta;}

}

function playanim(i : Transform) {

if (!i.animation.isPlaying){

i.animation.Play("run01");

}

}

private var startTime : float;

private var skill01Plan : int = 0;

var point : Transform[];

private var i = 0;

private var r = 400;

function Skill01(){

switch(skill01Plan){

case 0://技能第一阶段,设置各变量

skill01Plan = 1;

break;

case 1://技能第二阶段,等待之前的动画全部结束,开始播放转身动画

if(!Enemycenter.animation.isPlaying){

adduptime02 += Time.deltaTime;

if(adduptime02 > 0.7){

Enemycenter.animation.Play();

target = Vector3(sarah.position.x,0,sarah.position.z);

adduptime02 = 0;

skill01Plan = 2;

}

}else{mytransform.Translate(0,0,EnemySpeed*Time.deltaTime);}

break;

case 2://技能第三阶段,调整动画播放,并转身

if(Enemycenter.animation.isPlaying){

mytransform.forward = Vector3.RotateTowards(mytransform.forward,target - mytransform.position,10*Time.deltaTime,2*Time.deltaTime);

mytransform.Translate(0,0,EnemySpeed * 0.3 * Time.deltaTime);

}else {skill01Plan = 3;}

break;

case 3://技能第四阶段,设置各个目标点位置

skill01.position = mytransform.position;

skill01.rotation = mytransform.rotation;

//Instantiate(skill01,mytransform.position,mytransform.rotation);

skill01Plan = 4;

startTime = Time.time;

Enemycenter.animation.Play();

break;

case 4:

if((Time.time - startTime)*1.5 < 1.2){

mytransform.position = Vector3.Lerp(point[i].position, point[i+1].position, (Time.time - startTime)*1.5);

if(Time.time - startTime > 0.07 && Time.time - startTime < 0.17){

mytransform.forward = Vector3.RotateTowards(mytransform.forward,point[i+1].position - point[i].position,20*Time.deltaTime,2*Time.deltaTime);

}

}else{

i++;

if(i == 5){

skill01Plan = 0;

myState = 0;

i = 0;

}

startTime = Time.time;

Enemycenter.animation.Play("run01");

}

}

}

var point1 : Transform[];

function Skill02(){

switch(skill01Plan){

case 0://技能第一阶段

if(!Enemycenter.animation.isPlaying){

Enemycenter.animation.Play("skill01");

target = Vector3(sarah.position.x,0,sarah.position.z);

point1[0].position = target;

point1[0].rotation.y = Random.rotation.y;

for( var i=0; i < point1.length; i++){

Instantiate(skill02,point1[i].position,point1[i].rotation);

}

skill01Plan = 1;

}

break;

case 1:

if(!Enemycenter.animation.isPlaying){

skill01Plan = 0;

myState = 0;

}

}

}

private var newtarget : Vector3;

private var lastposition : Vector3;

function Skill03(){

switch(skill01Plan){

case 0://技能第一阶段

if(!Enemycenter.animation.isPlaying){

Enemycenter.animation.Play("skill01");

target = Vector3(sarah.position.x,0,sarah.position.z);

lastposition = target;

skill01Plan = 1;

}

break;

case 1:

//下面按照时间间隔计算玩家运动趋势

adduptime02 += Time.deltaTime;

if(adduptime02 > 0.47){

target = Vector3(sarah.position.x,0,sarah.position.z);

//将玩家上次位置与当前位置比较,得出将要前往的新目标点

newtarget = Vector3(target.x + (target.x - lastposition.x) * 5, 0,target.z + (target.z - lastposition.z) * 5);

Instantiate(skill02,newtarget,skill02.rotation);

//最后将Lastposition更新为玩家的位置以便下次使用

lastposition = target;

adduptime02 -= 0.47;

}

if(!Enemycenter.animation.isPlaying){

adduptime02 = 0;

skill01Plan = 0;

myState = 0;

}

}

}

function Skill04(){

switch(skill01Plan){

case 0://技能第一阶段,设置各变量

skill01Plan = 1;

break;

case 1://技能第二阶段,等待之前的动画全部结束,开始播放转身动画

if(!Enemycenter.animation.isPlaying){

adduptime02 += Time.deltaTime;

if(adduptime02 > 0.7){

Enemycenter.animation.Play("run01");

target = Vector3(sarah.position.x,0,sarah.position.z);

adduptime02 = 0;

skill01Plan = 2;

}

}else{mytransform.Translate(0,0,EnemySpeed*Time.deltaTime);}

break;

case 2://技能第三阶段,调整动画播放,并转身

if(Enemycenter.animation.isPlaying){

mytransform.forward = Vector3.RotateTowards(mytransform.forward,target - mytransform.position,10*Time.deltaTime,2*Time.deltaTime);

mytransform.Translate(0,0,EnemySpeed * 0.3 * Time.deltaTime);

}else {

Enemycenter.animation.Play("run01");

skill01Plan = 3;}

break;

case 3:

if(dist < 20){

playanim(Enemycenter);

target = Vector3(sarah.position.x,0,sarah.position.z);

mytransform.forward = Vector3.RotateTowards(mytransform.forward,target - mytransform.position,maxRadiansDelta*0.5*Time.deltaTime,2*Time.deltaTime);

mytransform.Translate(0,0,EnemySpeed * (2.3 - dist * 0.05) * Time.deltaTime);

}else{

skill01Plan = 0;

myState = 0;

}

break;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值