Python实现C#代码生成器应用服务于Unity示例解析

目录
  • 开发目标:实现小红帽所挂脚本的自动生成
    • 下图为生成的最终目标
    • 主程序具体python代码如下:
    • 所设置的TMPL文件如下:
    • 自动生成的c#代码展示如下:

开发目标:实现小红帽所挂脚本的自动生成

下图为生成的最终目标

本项目是从json中读取角色场景等信息,因此为了更好地判断所用属性是否需要,设置为bool类型,False表示在c#代码中注释掉该类属性,True代表使用该属性(属性暂时设置为)

    Timer = True # 计时器
    speed = False # 速度
    IsTrigger = True # 触发器
    start_point = True # 起始位置
    localScale = True # 起始大小

主程序具体python代码如下:

from string import Template
class BuildData:
    def Init(self):
        # 初始化各类$
        Timer = True
        speed = False
        IsTrigger = True
        start_point = True
        localScale = True
        # 输出a.cs文件
        filePath = 'a.cs'
        class_file = open(filePath, 'w')
        # mycode用来存放生成的代码
        mycode = []
        # 加载模板文件
        template_file = open('TMPL1.tmpl', 'rb')
        template_file = template_file.read().decode('utf-8')
        tmpl = Template(template_file)
        ##  模板替换
        # 1.需要判断是否使用的模板,不使用的给他注释掉
        if(Timer):
            TimerContent = ' '
        else:
            TimerContent = '///'
        if (speed):
            speedContent = ' '
        else:
            speedContent = '///'

        if (IsTrigger):
           IsTriggerContent =' '
        else:
            IsTriggerContent ='///'

        if (start_point):
            start_pointcontent= ' '
        else:
            start_pointcontent= '///'

        if (localScale):
            localScalecontent = ' '
        else:
            localScalecontent='///'
        # 2.固定的模板值更替
        mycode.append(tmpl.safe_substitute(
            TimerContent=TimerContent,
            speedContent=speedContent,
            IsTriggerContent=IsTriggerContent,
            start_pointcontent=start_pointcontent,
            localScalecontent=localScalecontent,
            role='Small_red_hat',
            x_start_point='12',
            y_start_point='-2',
            z_start_point='0',
            x_scale='0.45f',
            y_scale='0.5f',
            z_scale='1'
        ))
        # 将代码写入文件
        class_file.writelines(mycode)
        class_file.close()
        print('代码已生成')
if __name__ == '__main__':
    build = BuildData()
    build.Init()

所设置的TMPL文件如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ${role} : MonoBehaviour
{
    ${TimerContent} public float Timer;         //set a Timer
    ${speedContent} public float speed;   //speed
    ${IsTriggerContent} public bool IsTrigger;      //set a trigger
    void Start()
    {
        //the start_point of ${role}
        ${start_pointcontent}transform.position = new Vector3(${x_start_point}, ${y_start_point}, ${z_start_point});
        //the scale of ${role}
        ${localScalecontent}transform.localScale = new Vector3(${x_scale},${y_scale}, ${z_scale});
    }
    void Update()
    {
        //Timer countdown
        ${TimerContent} Timer += Time.deltaTime;
        //when to move
        ${TimerContent} if (Timer >= 2f && Timer <= 4f) {  IsTrigger = true;}
        //when to stop
        ${TimerContent} else if (Timer > 3.5f){  IsTrigger = false;}
        //the speed of ${role}
        ${IsTriggerContent}if(IsTrigger){ transform.Translate(-0.04f, 0, 0);}

    }
}

自动生成的c#代码展示如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Small_red_hat : MonoBehaviour
{
      public float Timer;         //set a Timer
    /// public float speed;   //speed
      public bool IsTrigger;      //set a trigger
    void Start()
    {
        //the start_point of Small_red_hat
         transform.position = new Vector3(12, -2, 0);
        //the scale of Small_red_hat
         transform.localScale = new Vector3(0.45f,0.5f, 1);
    }
    void Update()

    {
        //Timer countdown
          Timer += Time.deltaTime;
        //when to move
         if (Timer >= 2f && Timer <= 4f) {  IsTrigger = true;}
        //when to stop
          else if (Timer > 3.5f){  IsTrigger = false;}
        //the speed of Small_red_hat
        if (IsTrigger){ transform.Translate(-0.04f, 0, 0);}
    }
}

仔细观察生成的结果,代码与目标生成的代码基本一致,(注释暂时只能使用英文编辑。) 随即把生成的代码放在unity中,观察运行情况。

运行前:

运行后:

可见,小红帽的控制器实现基本无误。 具体视频已放在b站:

unity的2d的animation纯代码实现,场景切换。

以上就是Python实现C#代码生成器应用服务于Unity示例解析的详细内容,更多关于Python实现C#代码生成器应用Unity的资料请关注我们其它相关文章!

(0)

相关推荐

  • python 中的列表生成式、生成器表达式、模块导入

    5.16 列表生成式 l=[] for i in range(100): l.append('egg%s' %i) print(l) ​ l=['egg%s' %i for i in range(100)] l=['egg%s' %i for i in range(1000) if i > 10] print(l) 5.17 列表生成式与生成器表达式的应用 names=['egon','alex_sb','wupeiqi','yuanhao','lxx'] res=map(lambda x:x.

  • Python生成器以及应用实例解析

    本文研究的主要是Python生成器及其应用,具体如下. 一.定义 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),所以生成器就是可迭代对象 二.生成器的两种形式(Python有两种不同的方式提供生成器) 1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果.yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行 yield的功能: 把函数的结果做生迭代器(以一

  • 简单了解python 生成器 列表推导式 生成器表达式

    生成器就是自己用python代码写的迭代器,生成器的本质就是迭代器. 通过以下两种方式构建一个生成器: 1.通过生成器函数 2.生成器表达式 生成器函数: 函数 def func1(x): x += 1 return x print(func1(5)) 生成器函数 def func1(x): x += 1 yield x g_obj = func1(5) print(g_obj.__next__()) 一个next对应一个yield. yield VS return return 结束函数,给函

  • python 协程中的迭代器,生成器原理及应用实例详解

    本文实例讲述了python 协程中的迭代器,生成器原理及应用.分享给大家供大家参考,具体如下: 1.迭代器理解 迭代器: 迭代器是访问可迭代对象的工具 迭代器是指用iter(obj)函数返回的对象(实例) 迭代器是指用next(it)函数获取可迭代对象的数据 迭代器函数(iter和next) iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象 next(iterator) 从迭代器iterator中获取下一了记录,如果无法获取下一条记录,则触发

  • Python函数式编程指南:对生成器全面讲解

    生成器是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径. 这是函数式编程指南的最后一篇,似乎拖了一个星期才写好,嗯-- 1. 生成器(generator) 1.1. 生成器简介 首先请确信,生成器就是一种迭代器.生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中.另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的

  • Python实现C#代码生成器应用服务于Unity示例解析

    目录 开发目标:实现小红帽所挂脚本的自动生成 下图为生成的最终目标 主程序具体python代码如下: 所设置的TMPL文件如下: 自动生成的c#代码展示如下: 开发目标:实现小红帽所挂脚本的自动生成 下图为生成的最终目标 本项目是从json中读取角色场景等信息,因此为了更好地判断所用属性是否需要,设置为bool类型,False表示在c#代码中注释掉该类属性,True代表使用该属性(属性暂时设置为) Timer = True # 计时器 speed = False # 速度 IsTrigger =

  • Python数学建模学习模拟退火算法旅行商问题示例解析

    目录 1.旅行商问题(Travelling salesman problem, TSP) 2.模拟退火算法求解旅行商问题 3. 程序说明 4.模拟退火算法求解旅行商问题 Python 程序 5.运行结果 1.旅行商问题(Travelling salesman problem, TSP) 旅行商问题是经典的组合优化问题,要求找到遍历所有城市且每个城市只访问一次的最短旅行路线,即对给定的正权完全图求其总权重最小的Hamilton回路:设有 n个城市和距离矩阵 D=[dij],其中dij表示城市i到城

  • python编程matplotlib交互绘制Julia集示例解析

    目录 Julia集 matplotlib绑定事件 缩放 所谓Julia集就是类似下面的美妙的图案 Julia集 特别地,当 c = z的初始值时,符合收敛条件的 z 的便构成大名鼎鼎的Mandelbrot集 在上图中,颜色表示该点的发散速度,可以理解为开始发散时迭代的次数.其生成代码也非常简单: #mbrot.py import numpy as np import time import pyplotlib.pyplot as plt #生成z坐标,axis为起始位置,nx,ny为x向和y向的

  • Python编程中装饰器的使用示例解析

    装饰函数和方法 我们先定义两个简单的数学函数,一个用来计算平方和,一个用来计算平方差: # get square sum def square_sum(a, b): return a**2 + b**2 # get square diff def square_diff(a, b): return a**2 - b**2 print(square_sum(3, 4)) print(square_diff(3, 4)) 在拥有了基本的数学功能之后,我们可能想为函数增加其它的功能,比如打印输入.我们

  • Python实现曲线点抽稀算法的示例

    本文介绍了Python实现曲线点抽稀算法的示例,分享给大家,具体如下: 目录 何为抽稀 道格拉斯-普克(Douglas-Peuker)算法 垂距限值法 最后 正文 何为抽稀 在处理矢量化数据时,记录中往往会有很多重复数据,对进一步数据处理带来诸多不便.多余的数据一方面浪费了较多的存储空间,另一方面造成所要表达的图形不光滑或不符合标准.因此要通过某种规则,在保证矢量曲线形状不变的情况下, 最大限度地减少数据点个数,这个过程称为抽稀. 通俗的讲就是对曲线进行采样简化,即在曲线上取有限个点,将其变为折

  • 在Python中使用AOP实现Redis缓存示例

    越来越觉得的缓存是计算机科学里最NB的发明(没有之一),本文就来介绍了一下在Python中使用AOP实现Redis缓存示例,小伙伴们一起来了解一下 import redis enable=True #enable=False def readRedis(key): if enable: r = redis.Redis(host='10.224.38.31', port=8690,db=0, password='xxxx') val = r.get(key) if val is None: pri

  • Python文件的读写和异常代码示例

    一.从文件中读取数据 #!/usr/bin/env python with open('pi') as file_object: contents = file_object.read() print(contents) =================================== 3.1415926 5212533 2324255 1.逐行读取 #!/usr/bin/env python filename = 'pi' with open(filename) as file_obje

  • python shell根据ip获取主机名代码示例

    这篇文章里我们主要分享了python中shell 根据 ip 获取 hostname 或根据 hostname 获取 ip的代码,具体介绍如下. 笔者有时候需要根据hostname获取ip 比如根据machine.company.com 获得ip 10.173.14.117 方法1:利用 socket 模块 里的 gethostbyname 函数 代码如下,使用socket模块 >>> import socket >>> socket.gethostbyname(&qu

  • Python实现比较扑克牌大小程序代码示例

    是Udacity课程的第一个项目. 先从宏观把握一下思路,目的是做一个比较德州扑克大小的问题 首先,先抽象出一个处理的函数,它根据返回值的大小给出结果. 之后我们在定义如何比较两个或者多个手牌的大小,为方便比较大小,我们先对5张牌进行预处理,将其按照降序排序,如下: def card_ranks(hand): ranks = ['--23456789TJQKA'.INDEX(r) for r, s in hand] ranks.sort(reverse=True) return ranks 然后

  • Python爬取附近餐馆信息代码示例

    本代码主要实现抓取大众点评网中关村附近的餐馆有哪些,具体如下: import urllib.request import re def fetchFood(url): # 模拟使用浏览器浏览大众点评的方式浏览大众点评 headers = {'User-Agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'} ope

随机推荐