unity3d-代码控制游戏角色控制器移动
先上一个gif看看效果。因为图片大小限制。所以录制的比较小。个人认为效果比较牵强。特别是里面的逻辑代码。 不过我还是认为一切是为了先实现,因为我是刚接触的新手。

工程结构图

这次实现的效果是:
1:摄像机跟着角色移动,上篇博客说的是。把摄像机变成角色的子对象。发现没有我想要的效果。跟着角色移动代码是我自己弄出来的。不知道实际项目中是否也是这样。
2:利用角色控制器组建 CharacterController 实现角色移动。
3:当鼠左键击地形,角色自动寻路。今天发现用unity3d有自带的NavMesh实现自带寻路,不过还没去研究。
4:当鼠左键点击地形。实现一个高亮效果。
5:鼠标右键单击播放杀怪动画。
6:到达关卡场景,进入下一关。本来是想杀boss后在进入,但血条不会弄。
..............
Hierarchy视图中元素。分别是:主摄像机,平行光,地形,墙(也就是我这里的关卡),无效的元素,当前角色,鼠标点击显示图片,boss
加载场景的时候。需要把加载的场景Build进去

最后看看实现代码 ,有点牵强。也写了很多注释。方便大家和自己以后查看。
using UnityEngine;
using System.Collections; public class chartMove : MonoBehaviour
{ public float speed = 5f;
public GameObject cursor;//鼠标点击光标显示图片
public GameObject boos; //boos对象 private Vector3 targetPos; //目标位置
private Vector3 mousePos; //鼠标单击的位置
private Vector3 beforePos;//角色移动前的位置
private CharacterController charController = null;
private bool cursorState = false; //当前是否点击了鼠标
private bool BossIsDie;//bos是否over // Use this for initialization
void Start()
{
charController = GetComponent<CharacterController>();
targetPos = transform.position;
mousePos = transform.position;
} // Update is called once per frame
void Update()
{
beforePos = transform.position; //保存当前的位置 //获取按键轴
/*
* Horizontal-->对应键盘上上的A,D
* Vertical-->对应键盘上上的W,S
* 当没有按键的时候为0 。
* 其值分别为 -1(左,下) 0 1(上。右)
*/
float x = Input.GetAxis("Horizontal");
float y = Input.GetAxis("Vertical"); //transform.Translate(new Vector3(x, 0, y) * Time.deltaTime * speed,Space.World); //if (x == 0 && y == 0 && !cursorState)
//{
// transform.animation.Play("idle");
//}
if (x != || y != )
{
transform.animation.Play("run"); //奔跑
cursor.SetActive(false);
//charController.Move(new Vector3(x, 0, y) * Time.deltaTime * speed);
//transform.Translate(new Vector3(x, 0, y) * Time.deltaTime * speed, Space.World);
cursorState = false;
charController.SimpleMove(new Vector3(x, , y) * speed); //设置角色面朝的方向
Vector3 lookPos = transform.position - beforePos + transform.position;
transform.LookAt(lookPos);
}
else
{ } //左键选择路径
if (Input.GetMouseButtonDown())
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, )) //100为射线的长度,限制用户瞎点击。在100以为点击无效
{
if (hit.collider.name == "Terrain")
{
mousePos = hit.point;
Vector3 lookPos = mousePos - transform.position + transform.position;
transform.LookAt(lookPos);
cursor.SetActive(true); //显示图片:图片一开始是隐藏的。
cursor.transform.position = mousePos;
cursorState = true;
}
}
} //判断角色是否到达目的地
int distance = (int)Vector3.Distance(mousePos, transform.position); //这个1.08的临界值。我是根据调试得来的。具体为什么是1.08,暂时还不知道
if (distance > 1.08f && cursorState)
{
transform.animation.Play("run"); //奔跑 //控制向量长度在 speed 范围在内
Vector3 setp = Vector3.ClampMagnitude(mousePos - transform.position, speed);
//charController.Move(setp*0.3f); //开始我用这个方法。不是我想要的效果
/*
这里要区别于:Move() 一个更加复杂的运动函数,每次都绝对运动
* SimpleMove:以一定的速度移动角色
*/
//cursorState = false;
charController.SimpleMove(setp); }
else
{
if (x == && y == )
{
//transform.animation.Play("idle");
cursor.SetActive(false);
//cursorState = false;
if (!transform.animation.IsPlaying("attack"))//当前没有攻击
transform.animation.Play("idle");
}
//transform.animation.Play("idle");
}
//右键攻击
/*
GetMouseButton:按下不弹起就一直执行
* GetMouseButtonDown:按下执行一次。
*
*/
if (Input.GetMouseButton())
{
cursorState = true;
transform.animation.Play("attack");//攻击
}
//transform.animation.Play("run"); //奔跑
//设置角色面朝的方向
//Vector3 lookPos = transform.position - beforePos + transform.position;
//transform.LookAt(lookPos); //设置相机跟随
Vector3 camera = Camera.main.transform.position; //获取主相机的位置
Vector3 currChart = transform.position;//当前角色位置 camera.x = currChart.x;
camera.y = currChart.y + ;
camera.z = currChart.z - ; Camera.main.transform.position = camera; //if ((charController.collisionFlags & CollisionFlags.Above) != 0)
// print("touched the ceiling"); }
/// <summary>
/// 当控制器碰撞一个正在运动的碰撞器时,OnControllerColliderHit 被调用。
/// </summary>
/// <param name="hit"></param>
public void OnControllerColliderHit(ControllerColliderHit hit)
{ //如果碰到的是墙并且boos is die,进入下一关,这里 墙 代替关卡
if (hit.transform.name == "wall")
{
//加载关卡,2 表示Build Settings中场景的索引
Application.LoadLevel();
}
} public void OnTriggerEnter(Collider other)
{ } }
下一篇想弄动画的剪切,因为美工给程序的动画是一个总体。我们需要把某一个动作。比如蹦跑,杀怪等单个动画弄出来播放,就像上面的
transform.animation.Play("attack");//攻击
unity3d-代码控制游戏角色控制器移动的更多相关文章
- Unity3D 之3D游戏角色控制器运动
3D运动,绑定了人形控制器后的一个简单的运动方法. using UnityEngine; using System.Collections; public class PlayerMove : Mon ...
- [转]iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法
参考:http://www.mamicode.com/info-detail-469709.html 一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能( ...
- iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法
.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能(ipad我不了解除外,这里只说iPhone),这个方法是所有视图控制器对象都可以用的,而实现这种功能,有 ...
- Unity 代码控制游戏对象是父物体的第多少个子对象
一个canvas下的游戏对象,排列顺序越往下,渲染顺序就越靠后,就会覆盖在先前的图形上.也就是说,运行游戏后,物体的渲染顺序是一个一个计算的. Transform.SetSiblingIndex(in ...
- 游戏开发之在UE4中编写C++代码控制角色
当你运行我们上次做完的项目,你可能会意识到我们移动的摄像机还是默认的那个摄像机,这个默认的摄像机可以自由飞翔.这一节,我们要使得开始的角色是我们的一个Avatar类的实例对象,并且使用键盘控制我们的角 ...
- unity3d角色控制器01
参考出处貌似是雨松大神.如有侵权,立即删除. 需要导入包 ①将FirstPerson Controller拖拽入Hierarchy(层次视图)中.由于角色控制器是具有一定物理引擎的,所以一定要将它放在 ...
- 关于Unity中Mecanim动画的动画状态代码控制与代码生成动画控制器
对于多量的.复杂的.有规律的控制器使用代码生成 动画状态代码控制 1:每个动画状态,比如进入状态,离开状态, 等都有可能需要代码来参与和处理,比如,进入这个动画单元后做哪些事情,来开这个动画单元后做哪 ...
- [原]Unity3D深入浅出 - 角色控制器(Character Controller)
角色控制器主要用于第一人称和第三人称主角的控制,并不使用刚体物理效果. 添加角色控制器的方法:依次打开菜单栏中的Component - Physiscs - Character Controller ...
- Unity3D笔记 英保通六 角色控制器
一.角色控制器 U3D有两种角色控制方式:Rigidbody刚体.角色控制器组件(胶囊体组件) 面试的题目中经常会遇到这个问题: CharacterController和Rigidbody的区别? 这 ...
随机推荐
- ROS基础
在ROS中启动Gazebo物理仿真环境 roslaunch gazebo_ros empty_world.launch 打开后一片漆黑是以为gazebo需要从国外的网站上下载模型,国内网络不行,一直下 ...
- 转载:Maplab开源VI-SLAM框架介绍
https://blog.csdn.net/ccfiricen/article/details/79089694
- xCode 升级9.3之后巨卡
因为项目要适配iPhone8, iPhoneX 等.需要升级Xcode需要升级到9.3.但是 MAC系统是10.12的,需要升级到10.13. 系统升级完之后升级Xcode.之后Xcode 就各种卡. ...
- 记录一下ionic canvas图片,还有canvas里面的图片跨域的问题
import { Component, Inject, forwardRef } from '@angular/core'; import { IonicPage, NavController, Na ...
- Page11:状态反馈、输出反馈的概念及性能比较,极点配置的基本概念、意义及其算法[Linear System Theory]
内容包含离散时间线性时不变系统的稳定判据 状态反馈.输出反馈的基本概念及其性能比较 极点配置的基本概念.意义及其算法
- [X][xrandr][archlinux] 手动调整显示器分辨率
有一些时候,电脑并不能正确的识别出显示器的最大分辨率,这有可能是软件的原因,硬件的原因,显示器的原因,VGA线的原因等其他原因. 我遇到的情况,是开机时候连着VGA的话,就可以正确识别.如果使用中间进 ...
- scala-LinkedList
LinkedList每隔元素乘以3: import scala.collection.mutable.LinkedList var list1=LinkedList.apply(1,2,3,4,5) ...
- mysql存储引擎的简介
前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 ...
- Java+selenium 如何操作日历控件
场景:一般的日期控件都是input标签下弹出来的,如果使用webdriver 去设置日期, 1. 定位到该input 2. 使用sendKeys 方法 但是,有的日期控件是readonly的 ,比如神 ...
- TensorFlow安装之后导入报错:libcudnn.so.6:cannot open sharedobject file: No such file or directory
转载自:http://blog.csdn.net/silent56_th/article/details/77587792 系统环境:Ubuntu16.04 + GTX1060 目的:配置一下pyth ...