unity3d-游戏实战突出重围,第四天 添加角色
1:添加unity自带的第一人称角色控制器,命名为hreo
2:添加第三人称角色控制器。这里是添加源文件Sources下面的。如箭头指示:而不是“3rd Person Controller”。并命名为NPC。并设置预设,和加上BOX碰撞器。产生多个NPC。结构图:

3:修改hreo自带的Mouse Look脚本
using UnityEngine;
using System.Collections; /// MouseLook rotates the transform based on the mouse delta.
/// Minimum and Maximum values can be used to constrain the possible rotation /// To make an FPS style character:
/// - Create a capsule.
/// - Add the MouseLook script to the capsule.
/// -> Set the mouse look to use LookX. (You want to only turn character but not tilt it)
/// - Add FPSInputController script to the capsule
/// -> A CharacterMotor and a CharacterController component will be automatically added. /// - Create a camera. Make the camera a child of the capsule. Reset it's transform.
/// - Add a MouseLook script to the camera.
/// -> Set the mouse look to use LookY. (You want the camera to tilt up and down like a head. The character already turns.)
[AddComponentMenu("Camera-Control/Mouse Look")]
public class MouseLook : MonoBehaviour { public enum RotationAxes { MouseXAndY = , MouseX = , MouseY = }
public RotationAxes axes = RotationAxes.MouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F; public float minimumX = -360F;
public float maximumX = 360F; public float minimumY = -60F;
public float maximumY = 60F; float rotationY = 0F; //鼠标准心
public Texture2D tex_fire; void Update ()
{
if (axes == RotationAxes.MouseXAndY)
{
//float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX; //rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
//rotationY = Mathf.Clamp (rotationY, minimumY, maximumY); //transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
else if (axes == RotationAxes.MouseX)
{
transform.Rotate(, Input.GetAxis("Mouse X") , );
}
else
{
//rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
//rotationY = Mathf.Clamp (rotationY, minimumY, maximumY); transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, );
}
} void OnGUI()
{
if (tex_fire)
{
//绘制鼠标准心
float x = Input.mousePosition.x - tex_fire.width / ;
float y = Screen.height - Input.mousePosition.y - tex_fire.height / ; GUI.DrawTexture(new Rect(x, y, tex_fire.width, tex_fire.height), tex_fire);
}
} void Start ()
{
// Make the rigid body not change rotation
if (GetComponent<Rigidbody>())
GetComponent<Rigidbody>().freezeRotation = true; //取消鼠标默认状态
Screen.showCursor = false;
}
}
5 :编写脚本命名为dr.cs绑定到NPC上
using UnityEngine;
using System.Collections; public class dr : MonoBehaviour
{ //是否绘制敌人血条
bool showBlood = false;
//血条资源贴图
public Texture2D tex_red;
public Texture2D tex_black;
//生命值
private int HP = ;
//主角对象
private GameObject hero;
// Use this for initialization
void Start()
{
hero = GameObject.Find("Hero");
} // Update is called once per frame
void Update()
{
//设置始终朝向
transform.LookAt(hero.transform);
} void OnGUI()
{
if (showBlood)
{
//绘制敌人血条
int blood_widht = tex_red.width * HP / ;
GUI.DrawTexture(new Rect(, , tex_black.width, tex_black.height), tex_black);
GUI.DrawTexture(new Rect(, , blood_widht, tex_red.height), tex_red);
}
} /// <summary>
/// 当鼠标在GUIElement(GUI元素)或Collider(碰撞体)上点击时调用OnMouseDown。
/// </summary>
void OnMouseDown()
{
//敌人击中目标
if (HP > )
{
//减血
HP -= ;
//击打回馈
}
}
/// <summary>
/// 当用户释放鼠标按钮时调用OnMouseUp。
/// </summary>
void OnMouseUp()
{
//击打敌人后移动一段距离
transform.Translate(Vector3.back * 0.1f);
}
/// <summary>
/// 当鼠标悬浮在GUIElement(GUI元素)或Collider(碰撞体)上时调用 OnMouseOver 。
/// </summary>
void OnMouseOver()
{
//当对着敌人时,开始绘制血条,即显示敌人当前的血条
showBlood = true; }
/// <summary>
/// 当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。
/// </summary>
void OnMouseExit()
{
//结束绘制血条
showBlood = false;
}
}
7:dr.cs脚本实现了。当鼠标指向敌人时,显示敌人当前的血条情况,
当击中敌人时候。敌人会后退几步。
dr.cs脚本升级:敌人AI即人工智能
实现功能:让NPC有自己的生命周期:就是自己巡逻。当在巡逻范围内看到hero,即跑向hero开始攻击(这里暂为实现)
using UnityEngine;
using System.Collections; public class drAI : MonoBehaviour
{ //敌人状态 //敌人站立状态
public const int STATE_STAND = ;
//敌人行走状态
public const int STATE_WALK = ;
//敌人奔跑状态
public const int STATE_RUN = ;
//记录敌人的当前状态
private int enemyState;
//主角对象
private GameObject hero;
//备份上一次的敌人思考时间
private float backUptime;
//敌人思考下一次行为的时间
public const int AI_THINK_TIME = ;
//敌人的巡逻范围
public const int AI_ATTACK_DISTANCE = ; // Use this for initialization
void Start()
{
//得到主角对象
hero = GameObject.Find("/Hero");
//设置敌人的默认状态为站立
enemyState = STATE_WALK;
} // Update is called once per frame
void Update()
{
//判断敌人与主角的距离 当在巡逻范围内
if (Vector3.Distance(transform.position, hero.transform.position) < AI_ATTACK_DISTANCE)
{
//敌人进入奔跑状态
gameObject.animation.Play("run");
enemyState = STATE_RUN;
//设置敌人面朝主角方向
transform.LookAt(hero.transform);
}
//敌人进入巡逻状态
else
{
//计算敌人的思考时间
if (Time.time - backUptime >= AI_THINK_TIME)
{
//敌人开始思考
backUptime = Time.time;
//取得0~2之间的随机数
int rand = Random.Range(, );
if (rand == )
{
//敌人进入站立状态
gameObject.animation.Play("idle");
enemyState = STATE_STAND;
}
else if (rand == )
{
//敌人进入行走状态
//敌人随机旋转角度
Quaternion rotate = Quaternion.Euler(, Random.Range(, ) * , );
//1秒内完成敌人旋转
transform.rotation = Quaternion.Slerp(transform.rotation, rotate, Time.deltaTime * );
//播放行走动画
gameObject.animation.Play("walk");
enemyState = STATE_WALK;
}
}
}
switch (enemyState)
{
case STATE_STAND: break;
case STATE_WALK:
//敌人行走
transform.Translate(Vector3.forward * Time.deltaTime);
break;
case STATE_RUN:
//敌人朝向主角奔跑
if (Vector3.Distance(transform.position, hero.transform.position) > )
{
transform.Translate(Vector3.forward * Time.deltaTime * );
}
break;
default:
break;
}
}
}
知识点:
Quaternion四元素表示旋转。Quaternion.Euler()方法返回一个旋转的四元素。该方法参数表示旋转的三维角度。执行该方法后,将
四元素赋值给一个对象的旋转变量
transform.rotation = rotate 即可在一帧内完成旋转,若想在一段时间内完成旋转,就需要用到
Quaternion.Slerp()方法:
第一个参数表示模型旋转的起始角度
第二参数表示模型的结束角度
第三个参数表示旋转消耗的时间
unity3d-游戏实战突出重围,第四天 添加角色的更多相关文章
- Unity3D游戏开发和网络游戏实战书籍及配套资源和一些视频教程分享
目录 1. 按 2. pdf 3. 配套资源 3.1. Unity网络游戏实战第二版 3.2. Unity网络游戏实战第一版 4. 视频教程 5. 更多坦克大战代码 1. 按 本文主要分享了: Uni ...
- Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...
- Unity3D项目实战笔记(5):延时功能的几种实现
我所做过的系统,分单机版系统(2005年).CS系统(2010年).实时系统(2015年),各个系统均有“延时”功能:定时调度的: 本博客说的是实时系统中的延时功能(基于Unity3D游戏引擎). 在 ...
- [Unity3D]Unity3D游戏开发之飞机大战项目解说
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...
- [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)
---------------------------------------------------------------------------------------------------- ...
- [整理]Unity3D游戏开发之Lua
原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...
- [转载]Unity3D游戏引擎最详尽基础教程
原文地址:Unity3D游戏引擎最详尽基础教程作者:ShangShang 我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGor ...
- Unity3D游戏开发之SQLite让数据库开发更简单
各位朋友大家好.欢迎大家关注我的博客,我是秦元培,我是博客地址是http://blog.csdn.net/qinyuanpei.在经历了一段时间的忙碌后,博主最终有时间来研究新的东西啦,今天博客向和大 ...
- Unity3D游戏轻量级xlua热修复框架
Unity3D游戏轻量级xlua热修复框架 一 这是什么东西 前阵子刚刚集成xlua到项目,目的只有一个:对线上游戏C#逻辑有Bug的地方执行修复,通过考察xlua和tolua,最终选择了xlua ...
随机推荐
- [No000013F]WPF学习之X名称空间详解
X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的.用来引导XAML代码将XAML代码编译为CLR代码. 4.1X名称空间里面到底都有些什么? x名称空间映射的是:htt ...
- win10环境下搭建zookeeper伪集群
一.下载zookeeper https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/ 这里笔者下载的是zookeeper-3.3.6 二.配置zoo ...
- nvm npm node
npm init/install 语义版本号分为X.Y.Z三位,分别代表主版本号.次版本号和补丁版本号.当代码变更时,版本号按以下原则更新. 如果只是修复bug,需要更新Z位. 如果是新增了功能,但是 ...
- End-to-end and Hop-by-hop Headers ---nginx-websocket
https://www.oschina.net/translate/websocket-nginx 13.5.1 End-to-end and Hop-by-hop Headers For the p ...
- spring quartz动态修改执行时间
1.获取schedule <bean name="startQuartz" lazy-init="false" autowire="no&quo ...
- ansible--我的几个报错
我的几个报错: 1.远程复制失败 [root@localhost ~ ]#scp -r .ssh 192.168.10.145:/root/ root@192.168.10.145's passwor ...
- python server
#!/usr/bin/env python #coding=utf-8 # modifyDate: 20120808 ~ 20120810 # 原作者为:bones7456, http://li2z. ...
- SpringMVC(三):参数绑定、输入输出转换
一.参数解析绑定 1. 自定义绑定:不绑定某些项 @InitBinder private void initBinder(WebDataBinder dataBinder) { dataBinder. ...
- block详解
Objective-C 中 Block 有三种类型: NSStackBlock 存储于栈区 NSGlobalBlock 存储于程序数据区 NSMallocBlock 存储于堆区 block 内部没有引 ...
- python-面向对象-01_面向对象(OOP)基本概念
面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...