文章目录

  • Unity+C# 初入(一)
  • 系统环境
  • 1 旋转立方体
  • 对象创建
  • 脚本攥写
  • 脚本集成到对象
  • 2 角色漫游
  • 物品配置
  • 脚本创建
  • 脚本集成到物品上
  • 问题记录
  • 参考教程


Unity+C# 初入(一)

系统环境

系统:win10 专业版
Unity版本: 2019
C# 编辑器:rider

1 旋转立方体

对象创建

新建3D项目——>创建一个平面——>创建一个立方体

如下图所示

unity创建几何体 unity创建立方体_对象创建

脚本攥写

在project中添加一个C#脚本,取名为"MyScript"

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyScript : MonoBehaviour
{
    // Start is called before the first frame update
    //public GameObject Cube;
    public int transSpeed = 100;
    public float rotaSpeed = 10.5f;
    public float scale = 3;
    public void OnGUI()
    {
        if (GUILayout.Button("移动立方体"))
        {
            // GameObject.Find("Cube").GetComponent<Transform>().transform.Translate(Vector3.forward*transSpeed*Time.deltaTime,Space.World);
            Cube.transform.Translate(Vector3.forward*transSpeed*Time.deltaTime,Space.World);
        }

        if (GUILayout.Button("旋转立方体"))
        {
            GameObject.Find("Cube").GetComponent<Transform>().transform.Rotate(Vector3.up*rotaSpeed,Space.World);

        }
        if (GUILayout.Button("缩放立方体"))
        {
            // Cube.transform.localScale = new Vector3(scale,scale,scale);
            GameObject.Find("Cube").GetComponent<Transform>().transform.localScale= new Vector3(scale,scale,scale);;

        }
        // throw new NotImplementedException();
    }
}

脚本集成到对象

直接把脚本添加到main相机的组件里面就可以

2 角色漫游

物品配置

  1. 一个地面平面
  2. 一个empty的物品,取消重力作用和添加运动学作用,取名为player,并添加标签名称player。如下图

3.地面平面上添加几个物品,球体什么的 无所谓

最终效果如下图

![在这里插入图片描述](

unity创建几何体 unity创建立方体_对象创建_02


脚本创建

创建脚本,取名为”player“
里面的代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    // 摄像机属性
    private Transform m_camTransform;
    // 相机旋转角度
    private Vector3 m_camRot;
    // 相谁相机高度
    private float m_camHeiht = 1.4f;
    public Transform m_transform;
    private CharacterController m_ch;
    private float m_movSpeed = 3.0f;
    private float m_gravity = 2.0f;



    // Start is called before the first frame update
    void Start()
    {

        m_transform = this.transform;
        m_ch = this.GetComponent<CharacterController>();
        // 获取摄像机
        m_camTransform = Camera.main.transform;
        Vector3 pos = m_transform.position;
        pos.y += m_camHeiht;
        // 设置摄像机的旋转方向与主角一直
        m_camTransform.rotation = m_transform.rotation;
        m_camRot = m_camTransform.eulerAngles;
        // 锁定鼠标
        // Cursor.lockState = CursorLockMode.Locked;

    }

    // Update is called once per frame
    void Update()
    {
        Control();
    }

    void Control()
    {

        // 定义三个值控制运动
         float xm = 0, ym = 0, zm = 0;
         // 重力运动
         ym -= m_gravity * Time.deltaTime;
         // 前后左右移动
         if (Input.GetKey(KeyCode.W))
         {
             zm += m_movSpeed * Time.deltaTime;
         }
         else if (Input.GetKey(KeyCode.S))
         {
             zm -= m_movSpeed * Time.deltaTime;

         }
         else if (Input.GetKey(KeyCode.A))
         {
             xm -= m_movSpeed * Time.deltaTime;
         }
         else if (Input.GetKey(KeyCode.D))
         {
             xm += m_movSpeed * Time.deltaTime;
         }
         // 获取鼠标移动距离
         float rh = Input.GetAxis("Mouse X");  // 返回鼠标在这个轴上的值,鼠标移动的时候才会触发,这边的值应该是相对之前的距离,而不是绝对的距离
         float rv = Input.GetAxis("Mouse Y");   // 返回鼠标在这个轴上的值
         // 旋转摄像头
         m_camRot.x -= rv;  //这个画图解释比较方便
         m_camRot.y += rh;  //
         m_camTransform.eulerAngles = m_camRot;
         // 使角色的面向方向与相机一致
         Vector3 camrot = m_camTransform.eulerAngles;
         camrot.x = 0;
         camrot.z = 0;
         m_transform.eulerAngles = camrot;
         // 操作角色移动代码
         // 使相机位置和角色一样
         Vector3 pos = m_transform.position;
         pos.y += m_camHeiht;
         m_camTransform.position = pos;



         // 使用角色控制器提供的move函数进行移动
         m_ch.Move(m_transform.TransformDirection(new Vector3(xm, ym, zm)));
    }
}

脚本集成到物品上

将player脚本集成到player对象上即可

问题记录

问题 1. 按照参考教程里面的代码写的时候,一直提示mycube这个对象在引用前没有注册。
解决:因为采用rider的编辑器,在生成C#代码的时候,会自动填写start() 和update()函数,然后我并没有删掉,直接在下面开始写上面的代码,所以导致没有注册。

问题2:脚本改了好多次,发现鼠标指向功能一直没反应。
措施:是因为我自己是远程控制另外一台电脑写代码的,原来是远程软件的问题。 在原电脑上移动鼠标就可以。。尴尬