第三章 角色控制

 

1.创建游戏运行场景并导入素材资源

2.创建和管理标签

1        //const 表明这个是一个共有的不可变的变量
2 public const string ground = "Ground";//地面标签
3 public const string player = "Player";//人物标签

3.实现角色行走点击效果

给角色添加PlayerDir点击效果代码

 1        public GameObject effect_click_prefab;
2 void Update ()
3 {
4 if (Input.GetMouseButtonDown(0))
5 {
6 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
7 RaycastHit hitInfo;
8 //使用射线进行检测
9 bool isCollder = Physics.Raycast(ray, out hitInfo);
10 if (isCollder && hitInfo.collider.tag == Tags.ground)
11 {
12 //实例化点击的效果
13 ShowClickEffect(hitInfo.point);
14 }
15 }
16 }
17 void ShowClickEffect(Vector3 hitPoint)
18 {
19 hitPoint = new Vector3(hitPoint.x, hitPoint.y + 0.188888888f, hitPoint.z);
20 GameObject.Instantiate(effect_click_prefab, hitPoint, Quaternion.identity);
21 }

4.控制角色移动朝向

添加控制主角移动并优化PlayerDir代码

       public GameObject effect_click_prefab;
private bool isMoving = false;//表示鼠标是否按下
bublic Vector3 targetPosition = Vector3.zero;
void Update ()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
RaycastHit hitInfo;
//使用射线进行检测
bool isCollder = Physics.Raycast(ray, out hitInfo);
if (isCollder && hitInfo.collider.tag == Tags.ground)
{
isMoving = true;
//实例化点击的效果
ShowClickEffect(hitInfo.point);
LookAtTarger(hitInfo.point);
}
}
if (Input.GetMouseButtonUp(0))
{
isMoving = false;
}
//点击按下之后一直朝向鼠标位置
if (isMoving)
{
//得到要移动的目标位置
//让主角朝向目标位置
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
RaycastHit hitInfo;
//使用射线进行检测
bool isCollder = Physics.Raycast(ray, out hitInfo);
if (isCollder && hitInfo.collider.tag == Tags.ground)
{
LookAtTarger(hitInfo.point);
}
}
}
/// <summary>
/// 实例化点击效果
/// </summary>
/// <param name="hitPoint"></param>
void ShowClickEffect(Vector3 hitPoint)
{
hitPoint = new Vector3(hitPoint.x, hitPoint.y + 0.188888888f, hitPoint.z);
GameObject.Instantiate(effect_click_prefab, hitPoint, Quaternion.identity);
}
/// <summary>
/// 主角朝向位置
/// </summary>
/// <param name="hitPoint"></param>
void LookAtTarger(Vector3 hitPoint)
{
targetPosition = hitPoint;
targetPosition = new Vector3(targetPosition.x, transform.position.y, targetPosition.z);
this.transform.LookAt(targetPosition);
}

5.控制角色的移动

给角色添加Character Controller碰撞体组件

添加PlayerMove代码控制移动

 1     public float speed = 1f;//移动速度
2 private PlayerDir dir;
3 private CharacterController controller;
4 void Start()
5 {
6 dir = this.GetComponent<PlayerDir>();
7 controller = this.GetComponent<CharacterController>();
8 }
9 void Update()
10 {
11 float distance = Vector3.Distance(dir.targetPosition,transform.position);
12 if (distance > 0.5f)
13 {
14 controller.SimpleMove(transform.forward * speed);
15 }
16 }

6.控制角色移动动画播放

添加角色的移动动画

 

为PlayerMove代码添加枚举并更改Update

 1 public enum PlayerState
2 {
3 Moving,
4 Idle
5 }
6 public PlayerState state = PlayerState.Idle;
7
8 void Update()
9 {
10 float distance = Vector3.Distance(dir.targetPosition,transform.position);
11 if (distance > 0.5f)
12 {
13 state = PlayerState.Moving;
14 controller.SimpleMove(transform.forward * speed);
15 }
16 else
17 {
18 state = PlayerState.Idle;
19 }

新建PlayerAnimation动画切换代码

 1        private PlayerMove move;
2 void Start ()
3 {
4 move = this.GetComponent<PlayerMove>();
5 }
6
7 void LateUpdate ()
8 {
9 if (move.state == PlayerState.Moving)
10 {
11 PlayAnim("Walk");
12 }
13 else if (move.state == PlayerState.Idle)
14 {
15 PlayAnim("Idle");
16 }
17 }
18 void PlayAnim(string animName)
19 {
20 //animation.CrossFade(animName);
21 GetComponent<Animation>().CrossFade(animName);
22 }

7.添加控制相机跟随主角移动

给主相机添加FollowPlayer脚本并给人物添加Player标签

 1        private Transform player;
2 private Vector3 offsetPosltion;//位置偏移
3 void Start ()
4 {
5 player = GameObject.FindGameObjectWithTag(Tags.player).transform;
6 transform.LookAt(player.position);
7 offsetPosltion = transform.position - player.position;
8 }
9
10 void Update ()
11 {
12 transform.position = offsetPosltion + player.position;
13 }

8.控制视野的拉近和拉远

FollowPlayer代码中定义变量distance和scrollSpeed

 1        public float distance = 0f;//人物与相机的距离
2 public float scrollSpeed = 5f;//相机移动速度
3 添加scrollView方法并在Update中引用
4 /// <summary>
5 /// 视野的拉近和拉远效果
6 /// </summary>
7 void ScrollView()
8 {
9 print(Input.GetAxis("Mouse ScrollWheel"));//向前滑动返回正值 向后滑动返回负值
10 distance = offsetPosltion.magnitude;//位置偏移的magnitude值
11 distance += Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
12 distance = Mathf.Clamp(distance, 2, 18);//距离限制
13 offsetPosltion = offsetPosltion.normalized * distance;
14 }

9.控制视野的旋转

FollowPlayer代码中定义变量isRotating和rotateSpeed

1        private bool isRotating = false;
2 public float rotateSpeed = 1f;//相机旋转速度

添加RotateView方法并在Update中引用

 1        /// <summary>
2 /// 视野的旋转
3 /// </summary>
4 void RotateView()
5 {
6 //Input.GetAxis("Mouse X");//得到鼠标在水平方向的滑动
7 //Input.GetAxis("Mouse Y");//得到鼠标在垂直方向的滑动
8 if (Input.GetMouseButtonDown(1))
9 {
10 isRotating = true;
11 }
12 if (Input.GetMouseButtonUp(1))
13 {
14 isRotating = false;
15 }
16 if (isRotating)
17 {
18 transform.RotateAround(player.position, player.up, rotateSpeed * Input.GetAxis("Mouse X"));
19 Vector3 originalPos = transform.position;
20 Quaternion originalRotation = transform.rotation;
21 transform.RotateAround(player.position, transform.right, -rotateSpeed * Input.GetAxis("Mouse Y"));//影响属性有两个 position rotation
22 float x = transform.eulerAngles.x;
23 if (x < 10 || x > 80)
24 {//当超出范围之后,将属性归位原来的,让旋转无效
25 transform.position = originalPos;
26 transform.rotation = originalRotation;
27 }
28 }
29 offsetPosltion = transform.position - player.position;
30 }

10.角色添加状态信息

给角色添加PlayerStatus代码

 1     public int grade = 1;//等级
2 public int hp = 100;//血量
3 public int mp = 100;//蓝量
4 public int coin = 200;//金币数量
5 public int attack = 20;
6 public int attack_plus = 0;
7 public int def = 20;
8 public int def_plus = 0;
9 public int speed = 20;
10 public int speed_plus = 0;
11 public int point_remain = 0;//剩余的点数

11.修复BUG

修改PlayerDir

 1        public GameObject effect_click_prefab;
2 public Vector3 targetPosition = Vector3.zero;
3 private bool isMoving = false;//表示鼠标是否按下
4 private PlayerMove playerMove;
5 void Start()
6 {
7 targetPosition = transform.position;
8 playerMove = this.GetComponent<PlayerMove>();
9 }
10 void Update ()
11 {
12 if (Input.GetMouseButtonDown(0))
13 {
14 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
15 RaycastHit hitInfo;
16 //使用射线进行检测
17 bool isCollder = Physics.Raycast(ray, out hitInfo);
18 if (isCollder && hitInfo.collider.tag == Tags.ground)
19 {
20 isMoving = true;
21 //实例化点击的效果
22 ShowClickEffect(hitInfo.point);
23 LookAtTarger(hitInfo.point);
24 }
25 }
26 if (Input.GetMouseButtonUp(0))
27 {
28 isMoving = false;
29 }
30 //点击按下之后一直朝向鼠标位置
31 if (isMoving)
32 {
33 //得到要移动的目标位置
34 //让主角朝向目标位置
35 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
36 RaycastHit hitInfo;
37 //使用射线进行检测
38 bool isCollder = Physics.Raycast(ray, out hitInfo);
39 if (isCollder && hitInfo.collider.tag == Tags.ground)
40 {
41 LookAtTarger(hitInfo.point);
42 }
43 }
44 else
45 {
46 if (playerMove.isMoving)
47 {
48 LookAtTarger(targetPosition);
49 }
50 }
51 }
52 /// <summary>
53 /// 实例化点击效果
54 /// </summary>
55 /// <param name="hitPoint"></param>
56 void ShowClickEffect(Vector3 hitPoint)
57 {
58 hitPoint = new Vector3(hitPoint.x, hitPoint.y + 0.188888888f, hitPoint.z);
59 GameObject.Instantiate(effect_click_prefab, hitPoint, Quaternion.identity);
60 }
61 /// <summary>
62 /// 主角朝向位置
63 /// </summary>
64 /// <param name="hitPoint"></param>
65 void LookAtTarger(Vector3 hitPoint)
66 {
67 targetPosition = hitPoint;
68 targetPosition = new Vector3(targetPosition.x, transform.position.y, targetPosition.z);
69 this.transform.LookAt(targetPosition);
70 }

修改PlayerMove方法

 1     public float speed = 1f;//移动速度
2 public PlayerState state = PlayerState.Idle;
3 public bool isMoving = false;
4 private PlayerDir dir;
5 private CharacterController controller;
6 void Start()
7 {
8 dir = this.GetComponent<PlayerDir>();
9 controller = this.GetComponent<CharacterController>();
10 }
11 void Update()
12 {
13 float distance = Vector3.Distance(dir.targetPosition,transform.position);
14 if (distance > 0.5f)
15 {
16 isMoving = true;
17 state = PlayerState.Moving;
18 controller.SimpleMove(transform.forward * speed);
19 }
20 else
21 {
22 isMoving = false;
23 state = PlayerState.Idle;
24 }
25 }

Unity 黑暗之光 笔记 第三章的更多相关文章

  1. Android群英传笔记——第三章:Android控件架构与自定义控件讲解

    Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...

  2. 《DOM Scripting》学习笔记-——第三章 DOM

    <Dom Scripting>学习笔记 第三章 DOM 本章内容: 1.节点的概念. 2.四个DOM方法:getElementById, getElementsByTagName, get ...

  3. 《Linux内核设计与分析》第六周读书笔记——第三章

    <Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...

  4. spring boot 笔记--第三章

    spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...

  5. The Road to learn React书籍学习笔记(第三章)

    The Road to learn React书籍学习笔记(第三章) 代码详情 声明周期方法 通过之前的学习,可以了解到ES6 类组件中的生命周期方法 constructor() 和 render() ...

  6. [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设

    [HeadFrist-HTMLCSS学习笔记]第三章构建模块:Web页面建设 敲黑板!! <q>元素添加短引用,<blockquote>添加长引用 在段落里添加引用就使用< ...

  7. JVM学习笔记-第三章-垃圾收集器与内存分配策略

    JVM学习笔记-第三章-垃圾收集器与内存分配策略 tips:对于3.4之前的章节可见博客:https://blog.csdn.net/sanhewuyang/article/details/95380 ...

  8. Unity 黑暗之光 笔记 第一章

    第一章 设计游戏开始进入场景 1.设置相机视野同步 选中要调整的相机 GameObject - Align With View(快捷键 Ctrl + Shift + F)

  9. 《SQL CookBook 》笔记-第三章-多表查询

    目录 3.1 叠加两个行集 3.2 合并相关行 3.3 查找两个表中相同的行 3.4 查找只存在于一个表中的数据 3.5 从一个表检索与另一个表不相关的行 3.6 新增连接查询而不影响其他连接查询 3 ...

随机推荐

  1. php socket 编程问题总结

    1. PHP declare(ticks=N); 的作用 https://blog.csdn.net/udefined/article/details/24333333 2. pack &&a ...

  2. linux的time命令

    查看程序执行时间

  3. Python一行式代码

    # 简易Web Server,可以直接快速共享文件 python -m http.server # 脚本性能分析 python -m cProfile my_script.py # 列表辗平 impo ...

  4. CorelDRAW常用工具之涂抹工具

    CDR作为绘图软件或者说平面设计软件使用频繁的功能之一,就是为绘制好的图片进行涂抹混色. 1.基本操作 CorelDRAW平面设计软件的涂抹工具是在形状工具组里的,打开左侧工具栏"形状&qu ...

  5. 【flask-migrate】:ERROR [root] Error: Target database is not up to date.

    问题:flask-migrate数据迁移添加新的表,执行python manager.py db migrate 出现Target database is not up to date 原因: 1. ...

  6. js 实现textarea剩余字数统计

    1 针对textarea剩余字数统计 2 <div class="fankui-textarea"> 3 <span>留言:</span> &l ...

  7. JS你所不知的小数取整方法

    先介绍几种基本方法. 1.toFixed()方法 toFixed() 方法是属于 Number 对象的方法,可以把 Number 四舍五入到指定的小数位数,括号内为小数位数,范围为0~20,为0时即取 ...

  8. idea中快速将类中的属性转为Json字符串的插件

    当我们想要测试接口的时候,难免会根据一个类,一个一个的写json数据,当属性比较少时还行,但当属性多的时候就比较麻烦了, 为了解决这个问题,我们可以安装第三方的插件来快速生成json字符串. 步骤如下 ...

  9. 网络拓扑实例之交换机基于接口地址池作为DHCP服务器(六)

    组网图形 DHCP服务器简介 通常用户希望网络中的每台终端能够动态获取IP地址.DNS服务器的IP地址.路由信息.网关信息等网络参数,不需要手动配置终端的IP地址等网络参数:另外,针对一些移动终端(手 ...

  10. 【微信开发】缓存的asscess_token过期

    开发中有遇到这样一个问题,我们一般会将从微信拿到的寿命2个小时的access_token缓存起来,业务里这个缓存的时间是90分钟, 90分钟之后缓存过期,会重新请求新的access_token使旧的a ...